나는 IDispatch/IUnknown 포인터를 통해 볼 수있는 __vfptr과 혼동을 느낍니다. in-proc 무료 스레드 된 COM obj (IMyContainer)를 만들고 있습니다. 이 객체 안에는 동일한 IMyInterface를 구현하는 com 객체의 두 개의 다른 인스턴스에 대한 포인터를 유지해야합니다. 그래서 CreateAndSaveDispToMap()을 두 번 호출합니다.왜 두 개의 다른 인스턴스에 대해 동일한 __vfptr을 얻고 있습니까?
제 아이디어는 일부 표준 :지도에서 IDispatch 포인터를 유지하는 것입니다. 이 순간 나는 각 인스턴스가 1의 refCount를 가질 것이라고 의심합니다. 그렇습니다. 그러나 놀랍게도 나는 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 테이블은 주소 테이블 일뿐입니다. 모든 오브젝트 인스턴스에 대해 하나의 * v 테이블이 있으며 오브젝트 상태를 저장하지 않습니다. –