В моем приложении я создаю объект A, который создает объект 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 CRpcThread::WorkerLoop
.
Понятия не имею, как я указал, что QueryInterface
следует вызывать через OLE и RPC. Есть идеи?