You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询已安装的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:39:00