Как определить, является ли компьютер 32-разрядным или 64-разрядным? - PullRequest
5 голосов
/ 06 июня 2011

Как определить, является ли компьютер, на котором вы работаете, 32-разрядным или 64-разрядным?

Мне нужно, чтобы это было сделано в vba предпочтительно.

Ответы [ 6 ]

3 голосов
/ 14 января 2015

Я думаю, что самый простой способ:

#If Win64 Then
    MsgBox "Win 64"
#Else
    MsgBox "Win 32"
#End If

Иногда также полезно проверить, является ли ваш 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

НТН

3 голосов
/ 07 июня 2011

@ Ответ Вутера Саймона на правильном пути, но на самом деле неполный. В нем отсутствует пара Declare утверждений, а также какое-то объяснение.

Поэтому я считаю, что здесь стоит представить более полную и рабочую версию.

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

Оговорка:

Для совместимости с операционными системами, которые не поддерживают эту функцию, вызовите GetProcAddress, чтобы определить, реализован ли IsWow64Process в Kernel32.dll. Если GetProcAddress завершается успешно, вызывать эту функцию безопасно. В противном случае WOW64 нет. Обратите внимание, что этот метод не является надежным способом определения того, является ли операционная система 64-разрядной версией Windows, поскольку Kernel32.dll в текущих версиях 32-разрядной Windows также содержит эту функцию.

http://msdn.microsoft.com/en-us/library/ms684139%28v=vs.85%29.aspx

2 голосов
/ 06 июня 2011

получил это от 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

1 голос
/ 14 января 2015

Условная компиляция может быть очень полезна, 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
1 голос
/ 14 августа 2014

Чтобы определить, является ли запущенный Office 64-разрядным или 32-разрядным: используйте IsWow64Process (ответ от Жан-Франсуа Корбетта).

Чтобы определить, является ли Windows 64-разрядной или 32-разрядной:

Public Function isWin64bit() As Boolean
  isWin64bit = 0 < Len(Environ("ProgramW6432"))
End Function
0 голосов
/ 06 июня 2011

Я думаю, что VBA может быть связан с офисной версией, которая работает, и действительно важно, какой тип процесса запущен. Этот фрагмент кода может помочь (код 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
...