通过注册表检测Office是32位还是64位

Jam*_*ing 50 registry ms-office 32bit-64bit office-2010

既然Office也是64位安装,在注册表中你会发现安装的Office版本是32位还是64位?

Tod*_*ain 50

从TechNet上的64位版本的Office 2010文章:

如果已安装包含Microsoft Outlook 2010的Office 2010,则Outlook 会在安装它的计算机上设置名为Bitness的注册表项 ,类型为REG_SZ.所述 位数的注册表项指示的Outlook 2010安装是否是32位或64位.这对于有兴趣审核计算机以确定其组织中已安装的Office 2010版本的管理员可能很有用.

  • 注册表路径: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\14.0\Outlook
  • 如果您已安装Office 2013,则使用此注册表路径: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\15.0\Outlook
  • 注册表项:比特
  • 值:x86或x64

和同一篇文章中的其他地方:

从Office 2010开始,Outlook可用作32位应用程序和64位应用程序.您选择的Outlook版本(位数)取决于Windows操作系统(32位或64位)的版本以及计算机上安装的Office 2010(32位或64位)版本,如果Office已安装在该计算机上.

决定安装32位或64位版本Outlook的可行性的因素包括:

  • 您可以在受支持的32位或64位版本的Windows操作系统上安装32位Office 2010和32位Microsoft Outlook 2010.您只能在受支持的64位操作系统上安装64位版本的Office 2010和64位Outlook 2010.
  • 在64位版本的Windows操作系统上,Office 2010的默认安装是32位Office 2010.
  • 如果Office安装在同一台计算机上,则安装的Outlook版本的位数始终与Office 2010的位数相同.也就是说,32位版本的Outlook 2010无法安装在已安装64位版本的其他Office 2010应用程序的同一台计算机上,例如64位Microsoft Word 2010或64位Microsoft Excel 2010. ,64位版本的Outlook 2010无法安装在已安装32位版本的其他Office应用程序的同一台计算机上.

  • 请注意,对于单击运行实例,您可以在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration\platform”中找到位版本,其中值将是 x86 或 x64 (4认同)
  • 在我的测试环境中,如果安装是从*独立*Excel x64安装介质(即EXCEL 2010独立版)完成的,则此Bitness注册表项不存在.假设安装包具有可用的Outlook,则会放入Bitness字段,但如果Outlook甚至不是一个选项,则您不能依赖此键. (2认同)
  • 似乎不适用于 2016 年。当 Office 32 位安装在 64 位计算机上时,“HKEY_LOCAL_MACHINE\Software\Microsoft\Office\16.0\Outlook\Bitness”密钥不存在。不过,“HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Office\16.0\Outlook\Bitness”确实如此。 (2认同)
  • 为了我身后的下一个可怜的家伙的利益,Bitness 不是一个单独的键,而是主 Outlook 键下的一个值。 (2认同)

Tod*_*odK 23

我已经测试了Otaku的答案,即使没有安装Outlook,似乎也设置了Outlook位度值,即使引用的文章没有明确表明会出现这种情况.

  • 做得好.值得注意的是,在64位计算机上,位数值存在于:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook和HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Outlook中,这意味着您没有担心来自32位安装程序项目的Wow64Redirection (10认同)
  • 在我的 Office 2010 设置最少的机器上(只有 Excel 和 VBA,没有 Outlook),只能在 Wow6432Node 键下找到 Bitness 值。 (2认同)
  • 另一个警告:根据@ JohnSibly的评论,有时64位Outlook 2013(15.0)缺少Wow6432Node Bitness密钥.它[显然](http://www.symantec.com/business/support/index?page=content&id=TECH214359)是一个Office错误.这似乎总是64位365版Office的情况,我只看到64位非365版本. (2认同)

MB.*_*MB. 9

要添加到vtrz的答案,这是我为Inno Setup写的函数:

const
  { Constants for GetBinaryType return values. }
  SCS_32BIT_BINARY = 0;
  SCS_64BIT_BINARY = 6;
  { There are other values that GetBinaryType can return, but we're }
  { not interested in them. }

{ Declare Win32 function  }
function GetBinaryType(lpApplicationName: AnsiString; var lpBinaryType: Integer): Boolean;
external 'GetBinaryTypeA@kernel32.dll stdcall';

function Is64BitExcelFromRegisteredExe(): Boolean;
var
  excelPath: String;
  binaryType: Integer;
begin
  Result := False; { Default value - assume 32-bit unless proven otherwise. }
  { RegQueryStringValue second param is '' to get the (default) value for the key }
  { with no sub-key name, as described at }
  { http://stackoverflow.com/questions/913938/ }
  if IsWin64() and RegQueryStringValue(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe',
      '', excelPath) then begin
    { We've got the path to Excel. }
    try
      if GetBinaryType(excelPath, binaryType) then begin
        Result := (binaryType = SCS_64BIT_BINARY);
      end;
    except
      { Ignore - better just to assume it's 32-bit than to let the installation }
      { fail.  This could fail because the GetBinaryType function is not }
      { available.  I understand it's only available in Windows 2000 }
      { Professional onwards. }
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • +1 虽然您应该使用 Unicode 版本`GetBinaryTypeW`,另请参阅我对[从 Windows 注册表获取 Office 应用程序的版本和平台](/sf/ask/3320170591/#47443674)的回答。 (2认同)

vtr*_*trz 8

遗憾的是,但Otacku和@ clatonh的方法都不适用于我 - 在注册表中没有Outlook Bitness或{90140000-0011-0000- 1000 -0000000FF1CE}(对于没有安装Outlook的64位Office).

但是,我发现的唯一方法是使用Windows API函数GetBinaryType(自Windows 2000 Professional以来)检查其中一个Office可执行文件的位数.

例如,您可以检查Winword.exe的位数,该路径存储在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe下.

这是MFC代码片段:

CRegKey rk;
if (ERROR_SUCCESS == rk.Open(HKEY_LOCAL_MACHINE, 
  "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Winword.exe", 
  KEY_READ)) {
    CString strWinwordPath;
    DWORD dwSize = MAX_PATH;
    if (ERROR_SUCCESS == rk.QueryStringValue(strWinwordPath, 
        strWinwordPath.GetBuffer(MAX_PATH), &dwSize)) {
            strWinwordPath.ReleaseBuffer();
            DWORD dwBinaryType;
            if (::GetBinaryType(strWinwordPath, &dwBinaryType)) {
                if (SCS_64BIT_BINARY == dwBinaryType) {
                    // Detected 64-bit Office 
                } else {
                    // Detected 32-bit Office 
                }
            } else {
                // Failed
            }
        } else {
            // Failed
        }
    } else {
    // Failed
}
Run Code Online (Sandbox Code Playgroud)


chk*_*ksr 5

注意:如果在.NET环境中调用,查询Outlook应用程序的位数并不可靠.

在这里,我们在DLL中使用GetBinaryType(),可以被任何应用程序调用:

  • 如果主机应用程序是64位C/C++,则GetBinaryType()返回SCS_32BIT_BINARY.
  • 如果主机应用程序是64位.NET(我们在64位系统上测试"AnyCPU"),则GetBinaryType()返回SCS_64BIT_BINARY.

使用完全相同的DLL代码和完全相同的Outlook二进制路径("c:/ Program Files(x86)/ ...")在同一台计算机上.

这意味着您可能需要使用"IMAGE_NT_HEADERS.FileHeader.Machine"条目自行测试二进制文件.

上帝,我讨厌某些Windows API的错误返回值(另请参阅GetVersion()谎言).


小智 5

我找到了检查办公室咬伤的方法。

我们可以使用此注册表项检查office 365和2016的位数:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration
Run Code Online (Sandbox Code Playgroud)

平台x86(32位)。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration
Run Code Online (Sandbox Code Playgroud)

64位平台x64。

请检查...