В моих тестах многие из описанных здесь подходов дают сбой, я думаю, потому что они основаны на записях в реестре Windows, которые оказываются ненадежно представленными, в зависимости от версии Office, как он был установлен и т. Д. вообще не использовать реестр (хорошо, настолько строго, что это не дает ответа на поставленный вопрос), а вместо этого написать скрипт, который:
- Создает экземпляр Excel
- Добавляет книгу к этому экземпляру Excel
- Добавляет модуль VBA к этой книге
- Внедряет небольшую функцию VBA, которая возвращает разрядность Office
- Вызывает эту функцию
- Очищает
Вот этот подход, реализованный в VBScript:
Function OfficeBitness()
Dim VBACode, Excel, Wb, Module, Result
VBACode = "Function Is64bit() As Boolean" & vbCrLf & _
"#If Win64 Then" & vbCrLf & _
" Is64bit = True" & vbCrLf & _
"#End If" & vbCrLf & _
"End Function"
On Error Resume Next
Set Excel = CreateObject("Excel.Application")
Excel.Visible = False
Set Wb = Excel.Workbooks.Add
Set Module = Wb.VBProject.VBComponents.Add(1)
Module.CodeModule.AddFromString VBACode
Result = Excel.Run("Is64bit")
Set Module = Nothing
Wb.Saved = True
Wb.Close False
Excel.Quit
Set Excel = Nothing
On Error GoTo 0
If IsEmpty(Result) Then
OfficeBitness = 0 'Alternatively raise an error here?
ElseIf Result = True Then
OfficeBitness = 64
Else
OfficeBitness = 32
End If
End Function
PS. Этот подход работает медленнее, чем другие (около 2 секунд на моем ПК), но он может оказаться более надежным при различных установках и версиях Office.
Через несколько месяцев я понял, что, возможно, существует более простой подход, хотя и тот, который создает экземпляр Excel. VBScript:
Function OfficeBitness()
Dim Excel
Set Excel = CreateObject("Excel.Application")
Excel.Visible = False
If InStr(Excel.OperatingSystem,"64") > 0 Then
OfficeBitness = 64
Else
OfficeBitness = 32
End if
Excel.Quit
Set Excel = Nothing
End Function
Это зависит от того факта, что Application.OperatingSystem
при вызове из 32-битного Excel в 64-битной Windows возвращает Windows (32-bit) NT 10.00
или, по крайней мере, на моем ПК. Но это не упоминается в документах .