使用MsiGetProductInfo检查是否安装了Microsoft Word
Use MsiGetProductInfo to check if Microsoft Word is installed
我的电脑上安装了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位
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 带有 CKKS 的 Microsoft 密封中的矢量点积
- 如何添加预防措施以绕过未注册Microsoft.ACE.OLEDB.12.0?
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- 使用 Outlook 2016 Microsoft Store 连接到 Outlook COM
- 如何在 SEAL 3.1 中使用 CRT 批处理技术Microsoft?
- 使用 CMake,Microsoft MPI 和 Visual Studio 2017 找不到 mpi.h
- 如何在视觉c ++项目中添加箭头键作为修饰键Microsoft
- 为什么Microsoft在新代码中使用结构而不是类?
- Microsoft C++ 用于图形 API 的 Rest SDK
- Microsoft ODBC 无法创建有效的句柄
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 使用IMFSourceReader(Microsoft媒体基金会)进行音频流传输
- C++ VS 错误:<实验/文件系统>提供 std::experimental::文件系统的标头已被Microsoft弃用,将被删除
- 寻求提高Microsoft密封库计算效率的方法
- 使用MsiGetProductInfo检查是否安装了Microsoft Word
- 从 Word 获取Microsoft所有宏(使用自动化)
- 从c++程序访问Microsoft Word文档
- Microsoft Word连接点接收器示例/MFC出现问题
- 在我的c++程序中打开Microsoft Word