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

打包为MSIX的进程外COM服务器调用CoCreateInstance返回E_NOINTERFACE

问题分析与解决方案

你遇到的E_NOINTERFACE问题核心原因是MSIX打包的COM服务器未在清单中显式声明自定义接口信息,导致Windows的COM激活系统无法将CLSID_CComServerImpl与IExposedApi接口关联起来。虽然服务器能正常启动并支持IUnknown(所有COM对象默认实现),但自定义接口的映射关系未被系统识别。

解决步骤

1. 完善Package.appxmanifest的COM注册配置

在com:Class节点下添加接口声明,明确该类实现了IExposedApi接口。修改后的配置如下:

...
<Extensions>
    <com:Extension Category="windows.comServer">
        <com:ComServer>
            <com:ExeServer Executable="COMServer\COMServer.exe">
                <com:Class Id="D232CC3E-DE91-46DD-A9CD-3189FFADBA79">
                    <!-- 添加接口实现声明 -->
                    <com:ImplementedInterface Id="FA601A80-C76C-44B9-BE1E-CF1AFF7B56DA" />
                </com:Class>
            </com:ExeServer>
        </com:ComServer>
    </com:Extension>
</Extensions>
...

注意Id值必须与.idl文件中IExposedApi的UUID完全一致:FA601A80-C76C-44B9-BE1E-CF1AFF7B56DA。

2. 重新打包并部署MSIX包

修改清单后,必须重新生成MSIX安装包并重新部署,确保系统更新COM注册信息。

3. 验证客户端接口引用正确性

确保客户端代码中__uuidof(IExposedApi)对应的IID准确,建议直接引用.idl编译生成的头文件(比如midl工具生成的接口头文件),避免手动输入IID出错。

原理说明

MSIX打包环境下,COM对象的注册信息完全依赖Package.appxmanifest,而非传统注册表。如果清单仅注册CLSID但未声明其支持的自定义接口,系统处理客户端QueryInterface请求时无法找到对应映射,因此返回E_NOINTERFACE。而IUnknown是所有COM对象的基础接口,系统默认识别,所以能成功获取。

内容的提问来源于stack exchange,提问作者coda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:37:05