打包为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
相关产品推荐
相关产品推荐

