使用MsiGetProductInfo检查是否安装了Microsoft Word

时间:2016-06-02 09:30:27

标签: c# c++ ms-word windows-installer ms-office

我的电脑上安装了Microsoft Office 2013。 我正在尝试使用MsiGetProductInfo来查询有关该产品的信息(实际上我需要检查是否安装了Word)。

但是下面的C ++代码总是返回错误1605ERROR_UNKNOWN_PRODUCT),这意味着产品似乎没有安装,尽管它存在于已安装的应用程序列表中。

TCHAR szVersion[20];
DWORD cchVersion = 20;
LSTATUS st = MsiGetProductInfo(TEXT("{000209FF-0000-0000-C000-000000000046}"), INSTALLPROPERTY_VERSIONSTRING, szVersion, &cchVersion);

{000209FF-0000-0000-C000-000000000046}的注册表中找到了ClassID HKLM\Software\Classes\Word.Application\CLSID,我认为它应该留在Microsoft Word Application CLSID

如何正确使用MsiGetProductInfo以检查MS Word是否已安装?

2 个答案:

答案 0 :(得分:3)

MsiGetProductInfo采用产品代码,而不是CLSID,因此这种方法不起作用。如果您知道Microsoft Office正在使用的所有产品代码(我听说它们有数百个SKU,可能意味着数百个或产品​​代码),您可以按顺序搜索它们。但是,除非他们只有几个产品代码,并且不添加新产品代码(或者您不支持新版本),否则这不会扩展。

您可能最好将Word.Application类的注册表占用空间追溯到COM服务器,以及该文件上的版本块。或者,假设它是由MSI安装的,您可以尝试使用MsiEnumComponentsEx将文件跟踪到其安装组件,并MsiEnumClientsEx查找安装该组件的产品(或多个产品)。从那里你可以回到MsiGetProductInfo

请注意,这仅在通过MSI安装产品时才有效,并在注册表中留下足迹。很难确定未来版本是否会遵循这种方法。显然并非所有现有产品都通过MSI安装:Can't find installed Office 2013 Home and business with MsiEnumProducts

答案 1 :(得分:2)

这些链接可能有所帮助:

How to detect installed version of MS-Office?

并且还有一个像这样的文章集合,这些似乎表明ProductCode不是Betas等差异的最佳指标。

您还需要担心32位和64位版本的办公室,所以这也许有用:

Detect whether Office is 32bit or 64bit via the registry