【发布时间】:2011-08-26 07:48:52
【问题描述】:
在我的应用程序中,我通过CreateInstance 创建了一个对象 A,它创建了一个对象 B。两个对象应该存在于同一个进程中。
现在我看到对象 B 在请求某个接口时返回 E_NOINTERFACE,尽管我在 COM_MAP 中定义了它:
class B:
{
// ....
BEGIN_COM_MAP(B)
COM_INTERFACE_ENTRY(IB)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IXXX) // the interface I'm interested in
END_COM_MAP()
// .....
};
还有A码:
#define FORWARD_ERROR( expr ) { hr=expr; if( !SUCCEEDED( hr ) ) return hr;}
IBPtr b;
FORWARD_ERROR( b.CreateInstance( __uuidof( B ), 0, CLSCTX_INPROC_SERVER ) );
IXXXPtr x;
HRESULT hrIf = b.QueryInterface( __uuidof( IXXX ), x );
// ===> now x is NULL, and hrIf contains E_NOINTERFACE
当我调试它并在 COM_MAP 中放置一个断点时,我没有在最低帧中看到我的源代码,而是在一些 ole32.dll 的 CRpcThread::WorkerLoop 中。
我不知道我如何指出应该通过 OLE 和 RPC 调用 QueryInterface。有什么想法吗?
【问题讨论】:
-
CreateInstance 返回 S_OK 了吗?
-
@Sam:确实如此。我删除了示例中的检查代码;但会再次放入。
-
COM 接口和 coclass 是否在 Registry 中正确注册?