gpt4 book ai didi

c++ - CoCreateInstance 返回 E_NOINTERFACE 即使找到接口(interface)

转载 作者:可可西里 更新时间:2023-11-01 12:45:01 26 4
gpt4 key购买 nike

我有一个 COM 类 CMyCOMServer 在一个应用程序中实现了 IMyInterface,两者都具有正确的 GUID。如果请求 IUnknown 或 IMyInterface,CMyCOMServer::QueryInterface 将返回 S_OK(并将自身转换为正确的类型),否则返回 E_NOINTERFACE。

在同一台 PC 上的另一个应用程序中,我调用:

HRESULT hr = ::CoCreateInstance(__uuidof(CMyCOMServer), 0, CLSCTX_SERVER,
__uuidof(IMyInterface ),(void **)&pInterface);

它返回 E_NOINTERFACE。所以我假设我做错了什么并在 CMyCOMServer::QueryInterface 上添加了一个断点。我发现当CoCreateInstance被调用时,QueryInterface被不同的接口(interface)触发了几次:

  • 首先,请求 IUnknown - 没问题
  • 然后,请求多个接口(interface),如 IMarshall 等...这些不被支持,因此返回 E_NOINTERFACE
  • 最后,IMyInterface 被请求。我验证 QueryInterface 返回 S_OK 并将 (IMyInterface *)this 设置为接口(interface)指针,如预期的那样

所以我的困惑是,当 COM 服务器应用程序明确返回我要求的接口(interface)时,为什么调用 CoCreateInstance 给我留下一个 NULL 指针和 E_NOINTERFACE 的返回代码?

编辑:我的客户端应用程序在启动时调用 CoInitialize(NULL),这没有区别。

最佳答案

如果您的 COM 服务器运行在不同的进程中,或者在同一进程中的不同单元中,COM 需要知道在您调用您的接口(interface)时如何打包和传递参数。这个过程称为“编码”。

如果您定义自定义接口(interface),则需要使用以下方法之一为其实现编码(marshal)处理。

  • 标准编码(marshal)处理:让 MIDL 编译器生成代理和您必须在系统上注册的 stub 。这可能是最佳选择,因为您已经定义了界面。
  • OLE Automation marshaling:您定义一个自动化兼容自定义界面并使用编码器已经是COM框架
  • 自定义编码(marshal)处理:您实现 IMarshal 的方法

当您调试 COM 服务器时,虽然您看到在对 QueryInterface 的调用中返回了您的自定义接口(interface),但它并没有跨越进程边界,因为 COM 无法弄清楚如何编码该接口(interface),因此客户端看到 E_NOINTERFACE。

更新(根据您的评论)

如果这是一个现有的 COM 服务器应用程序,那么您可能已经有了一个代理/ stub 。您需要在客户端和服务器上注册它。会不会是你在一台新机器上测试它而你只是忘记注册它?要注册,您只需在代理/ stub dll 上执行 regsvr32。

关于c++ - CoCreateInstance 返回 E_NOINTERFACE 即使找到接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1781906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com