我对通过 IDispatch/IUnknown 指针看到的 __vfptr 感到困惑。我正在创建进程内免费线程 COM obj (IMyContainer)。在这个对象中,我需要保留指向实现相同 IMyInterface 的 com 对象的 2 个不同实例的指针。所以我两次调用 CreateAndSaveDispToMap()。
我的想法是将他们的 IDispatch 指针保存在一些 std::map 中。此时我怀疑每个实例的 refCount 都为 1。事实就是如此。但令人惊讶的是,我发现我通过 pUnk 获得了相同的 __vftbl 以获取 2 个不同的调度指针。
为什么?AddRef() 和 Release() 怎么可能正常工作?
HRESULT CMyContainer::CreateAndSaveDispToMap(...)
{
...
IMyInterface* pMyInterface = NULL;
hr = ::CoCreateInstance(CLSID_MyInterface, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pMyInterface);
pMyInterface->QueryInterface(IID_IDispatch, (void**)&pDisp);
pMyInterface->Release(); // Call Release since QI already called AddRef()
...
IUnknown* pUnk = NULL;
pDisp->QueryInterface(IID_IUnknown, (void**)&pUnk);
int refCount = pUnk->Release();
...
AddToMap(pDisp);
}