题
在我的应用程序,创建一个对象一,即创建的一个目B,两者都通过 CreateInstance
.这两个对象应该生活在同一个过程。
现在,我看到目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()
// .....
};
和一个代号:
#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's CRpcThread::WorkerLoop
.
我不知道我怎么说的 QueryInterface
应该通过OLE和RPC。任何想法?
解决方案
从你的说明它肯定是 编组踢.调动是通过隧道呼吁通过RPC因此它看起来很奇怪,但是它是如何做的。
消费者线有可能被称为 CoInitializeEx()
与 COINIT_APARTMENTTHREADED
.由于目创造标记为 Free
它已经不能建立在呼叫者的公寓(见 这非常好地解释上的公寓).而不是COM试图把调度上,你可能还没有 任何事情来促进调集 在这种情况下 CoCreateInstance()
返回 E_NOINTERFACE
因为COM内部运作的请求 一大堆的接口也会使用的用于调集 一旦所有这些请求失败了结束了 E_NOINTERFACE
和返回这当然是不方便你。
然后你改变 Free
要 Both
这意味着 "Apartment
的 Free
作为COM认为合适的" COM是正式允许放对象进入相同的公寓作者和没有编组的需要和所以你看不见那怪异的错误代码了。
其他提示
B
类的线程模型是“免费”,而我从多线程上下文创建对象。切换生成的“两个”解决问题。
不隶属于 StackOverflow