Определите, является ли Office 32-битным или 64-битным через реестр - PullRequest
50 голосов
/ 05 февраля 2010

Теперь, когда Office также поставляется с 64-битной установкой, где в реестре вы узнаете, является ли установленная версия Office 32-битной или 64-битной?

Ответы [ 29 ]

1 голос
/ 25 января 2019

В моих тестах многие из описанных здесь подходов дают сбой, я думаю, потому что они основаны на записях в реестре Windows, которые оказываются ненадежно представленными, в зависимости от версии Office, как он был установлен и т. Д. вообще не использовать реестр (хорошо, настолько строго, что это не дает ответа на поставленный вопрос), а вместо этого написать скрипт, который:

  1. Создает экземпляр Excel
  2. Добавляет книгу к этому экземпляру Excel
  3. Добавляет модуль VBA к этой книге
  4. Внедряет небольшую функцию VBA, которая возвращает разрядность Office
  5. Вызывает эту функцию
  6. Очищает

Вот этот подход, реализованный в 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 или, по крайней мере, на моем ПК. Но это не упоминается в документах .

1 голос
/ 28 сентября 2011

Ранее я слепо следил за ответом на основе документов MSDN. Сегодня это оказалось меньше, чем требовалось. На компьютере с установленным Office Home и Student, который не включает Outlook, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Outlook присутствовал, а HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook - нет. Теперь я изменил свой код, чтобы сначала искать «простую» версию без Wow6432Node. Если он присутствует, он будет использован. Если нет, то продолжим, посмотрев на версию Wow6432Node. Это проверяется установщиком на основе Inno Setup - я не знаю, какие API использует Inno Setup. Если ваше приложение не обращается к реестру таким же образом, вы можете увидеть другие результаты.

1 голос
/ 16 августа 2010

@ clatonh: это путь к реестру на моем ПК: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 14.0 \ Регистрация {90140000-002A-0000-1000-0000000FF1CE} и это определенно 32-битная установка на 64-битной ОС.

1 голос
/ 05 августа 2010

У меня нет ключа под названием bitness ни в одной из этих папок. У меня есть ключ «default» в обеих этих папках, а значение «unset». Мой компьютер поставлялся с Office 2010 Starter (я полагаю, 64-битный) Я удалил его и попытался сделать полную установку 32-битного офиса. Я продолжаю получать следующее сообщение. файл несовместим, проверьте, нужна ли вам версия программы для x86 или x64.

любой совет для меня?

1 голос
/ 19 марта 2018

Сначала я написал это для Outlook. Немного изменил его для Word, но он не будет работать при отдельной установке, потому что этот ключ не показывает разрядность, только Outlook.

Кроме того, я написал его для поддержки только текущих версий Office, => 2010

Я снял все настройки и постобработки ...

:checkarch
    IF NOT "%PROCESSOR_ARCHITECTURE%"=="x86" SET InstallArch=64bit
    IF "%PROCESSOR_ARCHITEW6432%"=="AMD64" SET InstallArch=64bit
    IF "%InstallArch%"=="64bit" SET Wow6432Node=\Wow6432Node
GOTO :beginscript

:beginscript
SET _cmdDetectedOfficeVersion=reg query "HKEY_CLASSES_ROOT\Word.Application\CurVer"
@FOR /F "tokens=* USEBACKQ" %%F IN (`!_cmdDetectedOfficeVersion! 2^>NUL `) DO (
SET _intDetectedOfficeVersion=%%F
)
set _intDetectedOfficeVersion=%_intDetectedOfficeVersion:~-2%


:switchCase
:: Call and mask out invalid call targets
    goto :case!_intDetectedOfficeVersion! 2>nul || (
:: Default case
    ECHO Not installed/Supported
    )
  goto :case-install

:case14
    Set _strOutlookVer= Word 2010 (!_intDetectedOfficeVersion!)
    CALL :GetBitness !_intDetectedOfficeVersion!
    GOTO :case-install  
:case15
    Set _strOutlookVer= Word 2013 (!_intDetectedOfficeVersion!)
    CALL :GetBitness !_intDetectedOfficeVersion!
    GOTO :case-install
:case16
    Set _strOutlookVer= Word 2016 (!_intDetectedOfficeVersion!)
    CALL :GetBitness !_intDetectedOfficeVersion!
    goto :case-install
:case-install
    CALL :output_text !_strOutlookVer! !_strBitness! is installed
GOTO :endscript


:GetBitness
FOR /F "tokens=3*" %%a in ('reg query "HKLM\Software%Wow6432Node%\Microsoft\Office\%1.0\Outlook" /v Bitness 2^>NUL') DO Set _strBitness=%%a
GOTO :EOF
0 голосов
/ 24 апреля 2013

Еще один способ определить разрядность Office - это найти typelib.

Например, чтобы определить разрядность Outlook, запишите файл .JS следующим образом:

function detectVersion()
    var outlooktlib = "TypeLib\\{00062FFF-0000-0000-C000-000000000046}";
    var HKCR = 0x80000000;

    var loc = new ActiveXObject("WbemScripting.SWbemLocator");
    var svc = loc.ConnectServer(null,"root\\default");
    var reg = svc.Get("StdRegProv");

    var method = reg.Methods_.Item("EnumKey");
    var inparam = method.InParameters.SpawnInstance_();
    inparam.hDefKey = HKCR;
    inparam.sSubKeyName = outlooktlib;
    var outparam = reg.ExecMethod_(method.Name,inparam);
    tlibver = outparam.sNames.toArray()[0];

    method = reg.Methods_.Item("GetStringValue");
    inparam = method.InParameters.SpawnInstance_();
    inparam.hDefKey = HKCR;
    inparam.sSubKeyName = outlooktlib + "\\" + tlibver + "\\0\\win32";
    inparam.sValueName = "";
    outparam = reg.ExecMethod_(method.Name,inparam);
    if(outparam.sValue) return "32 bit";

    method = reg.Methods_.Item("GetStringValue");
    inparam = method.InParameters.SpawnInstance_();
    inparam.hDefKey = HKCR;
    inparam.sSubKeyName = outlooktlib + "\\" + tlibver + "\\0\\win64";
    inparam.sValueName = "";
    outparam = reg.ExecMethod_(method.Name,inparam);
    if(outparam.sValue) return "64 bit";

    return "Not installed or unrecognizable";
}

Вы можете узнать идентификатор typelib другого компонента Office и заменить для него первую строку функции. Вот краткий список интересных идентификаторов:

{4AFFC9A0-5F99-101B-AF4E-00AA003F0F07} - Access
{00020905-0000-0000-C000-000000000046} - Word
{00020813-0000-0000-C000-000000000046} - Excel
{91493440-5A91-11CF-8700-00AA0060263B} - Powerpoint
{0002123C-0000-0000-C000-000000000046} - Publisher
{0EA692EE-BB50-4E3C-AEF0-356D91732725} - OneNote 2010+
{F2A7EE29-8BF6-4A6D-83F1-098E366C709C} - OneNote 2007

Все указанные выше идентификаторы lib были найдены с помощью инструмента Windows SDK OLE-COM Object Viewer, вы можете узнать больше идентификаторов lib, используя его.

Преимущество этого подхода заключается в том, что он работает для всех версий офиса и обеспечивает контроль над каждым компонентом, который вас интересует. Кроме того, эти ключи находятся в HKEY_CLASSES_ROOT и глубоко интегрированы в систему, поэтому маловероятно, что они были недоступны даже в среде песочницы.

0 голосов
/ 21 сентября 2011

У меня win 7 64 бит + Excel 2010 32 бит.Реестр HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 14.0 \ Registration {90140000-002A-0000-1000-0000000FF1CE}

Таким образом, это может указывать на разрядность ОС, а не разрядность Office

0 голосов
/ 15 августа 2017

Я нашел гораздо более простой способ. Используя Powershell, мы можем подключить Excel как COM-объект.

$user = $env:UserName
$msoExcel = New-Object -ComObject Excel.Application  
$msoExcel | Select-Object -Property OperatingSystem | Out-File "\\SERVER\Path\To\Dump\msoVersion-$user.txt"
exit

При запросе операционной системы таким образом мы получаем странные результаты, посмотрите здесь. ПК3 мой.

Я надеюсь, что это работает для вас, ребята. Извините за отсутствие кода; мои сценарии в основном функциональны.

Редактировать : Не забудьте добавить код, чтобы закрыть Excel после завершения извлечения данных.
После вчерашнего тестирования этого кода у меня внезапно появилось множество открытий и сбоев Excel.
Это обеспечит удовлетворение пользователей и администраторов (:

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($msoExcel)
Remove-Variable msoExcel
0 голосов
/ 11 августа 2016

Не через реестр, а через инструменты командной строки:

https://stackoverflow.com/a/6194710/2885897

C: \ Users \ me> assoc .msg

.msg = Outlook.File.msg.15

C: \ Users \ me> ftype Outlook.File.msg.15

Outlook.File.msg.15 = "C: \ Program Files ( x86 ) \ Microsoft Office \ Root \ Office16 \ OUTLOOK.EXE" / f "% 1"

0 голосов
/ 27 января 2017

Лучший простой способ: поместите значок «О» в приложение Office 2016. Пример Excel

1) Откройте Excel -> Файл -> Параметры -> Настроить ленту

2) Вы увидите 2 панели. Выберите команды из & настроить ленту

3) Из команды «Выбрать» выберите «Все команды»

4) Из полученного списка выделите О (Excel)

5) В меню «Настройка боли на ленте» выделите любой элемент (например, вид), в который вы хотите поместить значок «О программе»

6) Нажмите Новая группа внизу

7) Нажмите кнопку добавления, расположенную между двумя панелями. Совершено

Теперь, когда вы щелкнете по вкладке View в Excel и нажмете примерно, вы увидите 32-битную или 64-битную

...