私はIDispatch/IUnknownポインタを介して見る__vfptrと混乱しました。 私はin-procフリースレッドCOMオブジェクト(IMyContainer)を作成しています。このオブジェクトの中で、同じIMyInterfaceを実装するcomオブジェクトの2つの異なるインスタンスへのポインタを保持する必要があります。私はCreateAndSaveDispToMap()を2回呼び出します。2つの異なるインスタンスで同じ__vfptrが表示されるのはなぜですか?
私の考えは、いくつかのstd :: mapにIDispatchポインタを保持することです。現時点では、各インスタンスのrefCountが1になると思われます。そうです。しかし驚いたことに、私は2つの異なるディスパッチポインタのためにpUnkを使って同じ__vftblを取得していることがわかります。
なぜですか? 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テーブルは単なるアドレステーブルです。すべてのオブジェクトインスタンスに対して* 1つの* vテーブルがあり、オブジェクト状態を格納しません。 –