我對通過IDispatch/IUnknown指針看到的__vfptr感到困惑。 我正在創建自由線程的COM obj(IMyContainer)。在這個對象的內部,我需要保留指向2個實現相同IMyInterface的com對象的不同實例。所以我調用CreateAndSaveDispToMap()兩次。爲什麼我爲兩個不同的實例獲得相同的__vfptr?
我的想法是保持他們的IDispatch指針在一些std :: map。在這一刻,我懷疑每個實例的refCount都是1.它就是這樣。但令人驚訝的是,我看到我得到了相同的__vftbl通過pUnk 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);
}
v-表只是一個地址表。所有對象實例都有* one * v-table,它不存儲任何對象狀態。 –