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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-11 13:23:32  来源:igfitidea点击:

How to detect if the computer is 32-bit or 64-bit?

vbax86x86-64

提问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 Declarestatements 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, WinXXdetects 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