vba 如何检测计算机是 32 位还是 64 位?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6256140/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to detect if the computer is 32-bit or 64-bit?
提问by if_zero_equals_one
How do you determine if the computer you are on is a 32-bit machine or a 64-bit machine?
你如何确定你使用的计算机是 32 位机器还是 64 位机器?
I need this done in vba preferrably.
我需要最好在 vba 中完成。
采纳答案by THEn
got it from http://www.msoffice.us/Access/PDF/Extending%20VBA%20with%20APIs.pdf. Seems like it is working on mine.
从http://www.msoffice.us/Access/PDF/Extending%20VBA%20with%20APIs.pdf得到它 。似乎它正在我的工作。
Option Compare Database
Type SYSTEM_INFO
wProcessorArchitecture As Integer
wReserved As Integer
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOrfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
Declare Sub GetNativeSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Function Is64BitProcessor() As Boolean
Const PROCESSOR_ARCHITECTURE_AMD64 As Integer = 9
Const PROCESSOR_ARCHITECTURE_IA64 As Integer = 6
Dim si As SYSTEM_INFO
' call the API
GetNativeSystemInfo si
' check the struct
Is64BitProcessor = (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64 _
Or _
si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_IA64)
End Function
http://msdn.microsoft.com/en-us/library/ms724340(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ms724340(v=vs.85).aspx
回答by Jean-Fran?ois Corbett
@Wouter Simon's answer is sort of on the right track, but really incomplete. It is missing a couple of Declare
statements as well as some kind of explanation.
@Wouter Simon 的回答有点正确,但确实不完整。它缺少一些Declare
陈述以及某种解释。
Therefore I believe it's worth presenting a more complete and working version here.
因此,我认为值得在这里展示一个更完整和有效的版本。
Private Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, _
ByVal lpProcName As String) As Long
Private Declare Function GetModuleHandle Lib "kernel32" _
Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long '()
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function IsWow64Process Lib "kernel32" _
(ByVal hProcess As Long, ByRef Wow64Process As Long) As Long
Sub CheckWhetherIts64()
Dim Its64 As Long
Dim handle As Long
handle = GetProcAddress(GetModuleHandle("kernel32"), _
"IsWow64Process")
If handle > 0 Then ' IsWow64Process function exists
' Now use the function to determine if
' we are running under Wow64
IsWow64Process GetCurrentProcess(), Its64
End If
If Its64 = 1 Then
MsgBox "it's a 64 bit process."
End If
End Sub
Caveat:
警告:
For compatibility with operating systems that do not support this function, call GetProcAddress to detect whether IsWow64Process is implemented in Kernel32.dll. If GetProcAddress succeeds, it is safe to call this function. Otherwise, WOW64 is not present. Note that this technique is not a reliable way to detect whether the operating system is a 64-bit version of Windows because the Kernel32.dll in current versions of 32-bit Windows also contains this function.
为了兼容不支持该功能的操作系统,调用GetProcAddress检测Kernel32.dll中是否实现了IsWow64Process。如果 GetProcAddress 成功,则调用此函数是安全的。否则,WOW64 不存在。请注意,此技术不是检测操作系统是否为 64 位 Windows 版本的可靠方法,因为当前 32 位 Windows 版本中的 Kernel32.dll 也包含此功能。
http://msdn.microsoft.com/en-us/library/ms684139%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms684139%28v=vs.85%29.aspx
回答by Daniel Bonetti
I think the most straightforward way is:
我认为最直接的方法是:
#If Win64 Then
MsgBox "Win 64"
#Else
MsgBox "Win 32"
#End If
Sometimes it is also useful to check whether your Office is 32 or 64 and use this information to access the correct key in registry. So you can do:
有时检查您的 Office 是 32 位还是 64 位并使用此信息访问注册表中的正确密钥也很有用。所以你可以这样做:
#If Win64 Then
#If VBA7 Then
MsgBox "Win 64 and Office 64" ' HKEY_LOCAL_MACHINE\SOFTWARE\YourApp
#Else
MsgBox "Win 64 and Office 32" ' HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\YourApp
#End If
#Else
MsgBox "Win 32 and Office 32" ' HKEY_LOCAL_MACHINE\SOFTWARE\YourApp
#End If
HTH
HTH
回答by Qbik
Conditional compilation could be very useful, WinXX
detects environment but not hardware properties, example below :
条件编译可能非常有用,WinXX
检测环境但不检测硬件属性,示例如下:
Dim mVers As String
Sub Init()
#If Win64 Then
mVers = "Win64" ' Win64=true, Win32=true, Win16= false
Call VerCheck
#ElseIf win32 Then
mVers = "Win32" ' Win32=true, Win16=false
Call VerCheck
#ElseIf win16 Then
mVers = "Win16" ' Win16=true
Call VerCheck
#End If
End Sub
Sub VerCheck()
MsgBox "Version: " & mVers, vbInformation, "Version"
End Sub
回答by Falo
To determine whether the running Office is 64-bit or 32-bit: Use IsWow64Process (answer from Jean-Fran?ois Corbett).
要确定正在运行的 Office 是 64 位还是 32 位:使用 IsWow64Process(来自 Jean-Fran?ois Corbett 的回答)。
To determine whether Windows is 64-bit or 32-bit:
要确定 Windows 是 64 位还是 32 位:
Public Function isWin64bit() As Boolean
isWin64bit = 0 < Len(Environ("ProgramW6432"))
End Function
回答by Wouter Simons
I think VBA may be linked to the office version that is running and it really matters what type of process is running. This code snippet may help (VB6 code)
我认为 VBA 可能与正在运行的 Office 版本相关联,并且正在运行的进程类型非常重要。此代码片段可能会有所帮助(VB6 代码)
Private Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, _
ByVal lpProcName As String) As Long
Private Declare Function GetModuleHandle Lib "kernel32" _
Alias "GetModuleHandleA" _
handle = GetProcAddress(GetModuleHandle("kernel32"), _
"IsWow64Process")
If handle > 0 Then ' IsWow64Process function exists
' Now use the function to determine if
' we are running under Wow64
IsWow64Process GetCurrentProcess(), bolFunc
End If