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

Use MsiGetProductInfo to check if Microsoft Word is installed

本文关键字:Microsoft Word 安装 是否 MsiGetProductInfo 检查 使用      更新时间:2023-10-16

我的电脑上安装了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);

ClassID{000209FF-0000-0000-C000-000000000046}HKLMSoftwareClassesWord.ApplicationCLSID的注册表中找到,我想它应该保留在Microsoft Word应用程序CLSID中。

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

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

您最好按照Word.Application类的注册表示意图返回COM服务器,以及该文件上的版本块。或者,假设它是由MSI安装的,您可以尝试使用MsiEnumComponentsEx将文件跟踪到其安装组件,并使用MsiEnumClientsEx查找安装该组件的产品。从那里你可以返回MsiGetProductInfo。

请注意,只有通过MSI安装产品时,这才有效,并且会在注册表中留下足迹。很难说未来的版本是否会采用这种方法。显然不是所有现有的产品都通过MSI安装:Can';使用MsiEnumProducts找不到已安装的Office 2013 Home和business。

这些链接可能会有所帮助:

如何检测已安装的MS Office版本?

还有一组像这样的文章,这些文章似乎表明,由于Betas等的差异,ProductCode不是最好的指标。

你还需要担心32位和64位版本的office,所以这可能也很有用:

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