如何查询已安装的Packaged COM扩展点
可行解决方案
方案1:直接使用COM标准类别枚举接口(最推荐,改造成本最低)
系统原生提供的ICatInformation接口本身就支持同时检索传统注册表COM和Packaged COM条目,不需要你分别处理两类注册路径:
- 调用
CoCreateInstance创建CLSID_StdComponentCategoriesMgr实例,拿到ICatInformation接口指针 - 调用
ICatInformation::EnumClassesOfCategories方法,传入你需要匹配的目标Implemented Categories CATID,即可直接得到所有符合要求的COM类CLSID列表,包含MSIX打包的Packaged COM服务器 - 枚举得到的CLSID可直接用
CoCreateInstance正常实例化,和传统COM用法完全一致
C++示例代码片段:
#include <comcat.h> #include <wrl.h> using namespace Microsoft::WRL; HRESULT EnumerateMatchedComPlugins(REFCATID targetCatid, IEnumCLSID** outEnum) { *outEnum = nullptr; ComPtr<ICatInformation> catInfo; HRESULT hr = CoCreateInstance( CLSID_StdComponentCategoriesMgr, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&catInfo) ); if (FAILED(hr)) return hr; // 参数1为要求实现的类别数量,参数2为类别ID数组,后两个参数指定要排除的类别 return catInfo->EnumClassesOfCategories(1, &targetCatid, 0, nullptr, outEnum); }
你可以直接将原有扫描注册表的逻辑替换为上述调用,不需要额外维护两套检测逻辑。
方案2:通过MSIX包管理API枚举(适用于需要获取额外包信息的场景)
如果你需要同时获取COM服务器所属的MSIX包信息,可以用包管理API自行枚举:
- 调用
Windows.Management.Deployment.PackageManager(WinRT)或者Win32的FindPackagesByUserSecurityId系列API枚举当前用户/系统安装的所有MSIX包 - 对每个包,通过
IAppxManifestReader接口读取包的应用清单,定位到<com:ComServer>扩展节点,提取其中注册的CLSID、Implemented Categories等元数据 - 匹配提取到的元数据和你的目标类别ID,得到符合要求的Packaged COM服务器
不推荐的备选方案
Packaged COM的注册信息实际存储在注册表HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\Repository\Packages路径下各包对应的子键中,但该路径属于系统内部实现,可能随Windows版本更新发生变化,不建议直接依赖该路径做扫描。
内容的提问来源于stack exchange,提问作者Fredrik Orderud
相关产品推荐
相关产品推荐

