我的电脑上安装了Microsoft Office 2013。 我正在尝试使用MsiGetProductInfo来查询有关该产品的信息(实际上我需要检查是否安装了Word)。
但是下面的C ++代码总是返回错误1605
(ERROR_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是否已安装?
答案 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位版本的办公室,所以这也许有用: