IDispatch/IUnknownポインターから見える__vfptrと混同しました。インプロセスフリースレッドCOMobj(IMyContainer)を作成しています。このオブジェクト内には、同じIMyInterfaceを実装するcomオブジェクトの2つの異なるインスタンスへのポインターを保持する必要があります。そこで、CreateAndSaveDispToMap()を2回呼び出します。
私の考えは、IDispatchポインタをいくつかのstd::mapに保持することです。現時点では、各インスタンスの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);
}