Спасибо, я понял, что адреса функций в IUnknown одинаковы и должны быть такими.
Но все же не недооценивайте и поведение AddRef / Release. Когда я вхожу в режим отладки в ExposePointer (), я вижу, что второй последовательный вызов не принесет refCount к 3. Это вернет его к 2.
Но если я дважды вызову ForgetExposePointer (), вместо этого он достигнет 3.
Почему возвращение указателя отправки через Variant * Result или забвение возврата такого значения дает мне другой результат? Мое понимание того, что между Call 1 и Call 2 происходит скрытый вызов Release () ...
STDMETHODIMP CMyContainer::ExposePointer([in]int index, [out, retval] VARIANT* Result)
{
VariantInit(Result);
IDispatch* pDisp = m_map[index].second;
V_VT(Result) = VT_DISPATCH;
V_DISPATCH(Result) = pDisp;
refCount_x = pDisp->AddRef(); // Increment, because we expose
}
STDMETHODIMP CMyContainer::ForgetExposePointer([in]int index, [out, retval] VARIANT* Result)
{
VariantInit(Result);
IDispatch* pDisp = m_map[index].second;
refCount_y = pDisp->AddRef();
}
MyApp::Function1(...)
{
CreateAndSaveDispToMap(...); // refCount is 1 now
VARIANT var1;
VARIANT var2;
pMyContainer->ExposePointer(index, &var1); // Call 1
pMyContainer->ExposePointer(index, &var2); // Call 2
}
MyApp::Function2(...)
{
CreateAndSaveDispToMap(...); // refCount is 1 now
VARIANT var1;
VARIANT var2;
pMyContainer->ForgetExposePointer(index, &var1);
pMyContainer->ForgetExposePointer(index, &var2);
}