【发布时间】:2010-12-19 09:48:48
【问题描述】:
我有一个 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会针对不同的接口触发多次:
- 首先,请求 IUnknown - 没问题
- 然后,请求了几个接口,如 IMarshall 等...不支持这些接口,因此返回 E_NOINTERFACE
- 最后,请求 IMyInterface。我验证 QueryInterface 返回 S_OK 并将
(IMyInterface *)this设置为接口指针,正如预期的那样
所以我的困惑是为什么调用 CoCreateInstance 给我一个 NULL 指针并返回 E_NOINTERFACE 代码,而 COM 服务器应用程序显然返回了我要求的接口?
编辑:我的客户端应用程序在启动时调用 CoInitialize(NULL),这没有区别。
【问题讨论】:
-
澄清一下:您的 COM 服务器在一个应用程序中运行,而客户端在另一个应用程序中运行?因为这意味着它们将处于不同的进程中,而这反过来意味着您需要编组,可能是自定义的。
-
是的。 1 台电脑上有两个独立的应用程序。不过,我以前从来没有搞乱编组,这就是我感到困惑的原因。我以前几乎没有听说过,我已经做了相当多的 COM 开发。
标签: c++ windows visual-c++ com com-interop