使用 MsiGetProductInfo 检查是否安装了 Microsoft Word
Use MsiGetProductInfo to check if Microsoft Word is installed
我的电脑上安装了Microsoft Office 2013。
我正在尝试使用 MsiGetProductInfo 查询有关该产品的信息(实际上我需要检查是否安装了 Word)。
但是下面的 C++ 代码总是 returns 错误 1605
(ERROR_UNKNOWN_PRODUCT
) 这意味着该产品似乎没有安装,尽管它存在于列表中安装的应用程序。
TCHAR szVersion[20];
DWORD cchVersion = 20;
LSTATUS st = MsiGetProductInfo(TEXT("{000209FF-0000-0000-C000-000000000046}"), INSTALLPROPERTY_VERSIONSTRING, szVersion, &cchVersion);
ClassID {000209FF-0000-0000-C000-000000000046}
在 HKLM\Software\Classes\Word.Application\CLSID
的注册表中找到,我想它应该保留用于 Microsoft Word 应用程序 CLSID
.
如何正确使用 MsiGetProductInfo
以检查是否安装了 MS Word?
MsiGetProductInfo 采用产品代码,而不是 CLSID,因此这种方法行不通。如果您知道 Microsoft Office 使用的所有产品代码(我听说他们有数百个 SKU,这可能意味着数百或产品代码),您可以按顺序搜索它们。但是,除非他们只有几个产品代码,并且不添加新代码(或者您不支持新版本),否则这不会扩展。
您最好遵循 Word.Application class 的注册表足迹回到 COM 服务器,并在该文件上进行版本块。或者,假设它是由 MSI 安装的,您可以尝试使用 MsiEnumComponentsEx to trace the file to its installing component, and MsiEnumClientsEx to find the product (or products) that installed that component. And from there you could return to MsiGetProductInfo.
请注意,这仅适用于通过 MSI 安装产品并在注册表中留下足迹的情况。很难确定未来的版本是否会遵循这种方法。显然并非所有现有产品都通过 MSI 安装:.
这些链接可能有帮助:
How to detect installed version of MS-Office?
还有像这篇这样的文章合集,这些似乎表明 ProductCode 不是最佳指标,因为 Beta 等方面存在差异。
你还需要担心 32 位和 64 位版本的 office,所以这也可能有用:
Detect whether Office is 32bit or 64bit via the registry
我的电脑上安装了Microsoft Office 2013。 我正在尝试使用 MsiGetProductInfo 查询有关该产品的信息(实际上我需要检查是否安装了 Word)。
但是下面的 C++ 代码总是 returns 错误 1605
(ERROR_UNKNOWN_PRODUCT
) 这意味着该产品似乎没有安装,尽管它存在于列表中安装的应用程序。
TCHAR szVersion[20];
DWORD cchVersion = 20;
LSTATUS st = MsiGetProductInfo(TEXT("{000209FF-0000-0000-C000-000000000046}"), INSTALLPROPERTY_VERSIONSTRING, szVersion, &cchVersion);
ClassID {000209FF-0000-0000-C000-000000000046}
在 HKLM\Software\Classes\Word.Application\CLSID
的注册表中找到,我想它应该保留用于 Microsoft Word 应用程序 CLSID
.
如何正确使用 MsiGetProductInfo
以检查是否安装了 MS Word?
MsiGetProductInfo 采用产品代码,而不是 CLSID,因此这种方法行不通。如果您知道 Microsoft Office 使用的所有产品代码(我听说他们有数百个 SKU,这可能意味着数百或产品代码),您可以按顺序搜索它们。但是,除非他们只有几个产品代码,并且不添加新代码(或者您不支持新版本),否则这不会扩展。
您最好遵循 Word.Application class 的注册表足迹回到 COM 服务器,并在该文件上进行版本块。或者,假设它是由 MSI 安装的,您可以尝试使用 MsiEnumComponentsEx to trace the file to its installing component, and MsiEnumClientsEx to find the product (or products) that installed that component. And from there you could return to MsiGetProductInfo.
请注意,这仅适用于通过 MSI 安装产品并在注册表中留下足迹的情况。很难确定未来的版本是否会遵循这种方法。显然并非所有现有产品都通过 MSI 安装:
这些链接可能有帮助:
How to detect installed version of MS-Office?
还有像这篇这样的文章合集,这些似乎表明 ProductCode 不是最佳指标,因为 Beta 等方面存在差异。
你还需要担心 32 位和 64 位版本的 office,所以这也可能有用:
Detect whether Office is 32bit or 64bit via the registry