VS2015 C ++ / Windows7 SP1
Учитывая следующий код:
CComPtr<IFontDisp> m_pFont;
::OleCreateFontIndirect(&fdesc,IID_IFontDisp,(void**)&m_pFont);
VARIANT var = m_pFont; // PSEUDO CODE
после этого
var.vt = 9; //VT_DISPATCH
var.DISPATCH = "oleaut32.dll/IFontDisp"
Так что все выглядит хорошо.
Теперь я звоню
::VariantClear(var);
И я отладил в (ASM), я нашел это:
74CB2EA6 nop
CFont::Release:
--> 74CB2EA7 sub dword ptr [esp+4],4
74CB2EAC jmp CFont::Release (74CB2E79h)
74CB2EAE nop
74CB2EAF nop
74CB2EB0 nop
После кода:
CFont::Release:
--> 74CB2E79 mov edi,edi
74CB2E7B push ebp
74CB2E7C mov ebp,esp
74CB2E7E push esi
74CB2E7F mov esi,dword ptr [ebp+8]
74CB2E82 push edi
74CB2E83 lea eax,[esi+0A8h]
74CB2E89 push eax
74CB2E8A call dword ptr [__imp__InterlockedDecrement@4 (74C91298h)]
74CB2E90 mov edi,eax
74CB2E92 test edi,edi
74CB2E94 je CFont::Release+261h (74CB30DAh)
74CB2E9A mov eax,edi
74CB2E9C pop edi
74CB2E9D pop esi
74CB2E9E pop ebp
74CB2E9F ret 4
Итак, как я вижу, он освобождает интерфейс COM.
Но если я увижу MSDN документ о VariantClear:
если очищаемый вариант является объектом COM, который передается
Для справки, поле vt параметра pvargparameter - VT_DISPATCH | VT_BYREF
или VT_UNKNOWN | VT_BYREF. В этом случае VariantClear не освобождает
предмет. Поскольку очищаемый вариант является указателем на
ссылка на объект, VariantClear не может определить, является ли он
необходимо освободить объект. Поэтому ответственность лежит на
Вызывающий освободить объект или нет, в зависимости от ситуации.
В соответствии с этим он не должен вызывать release для IFontDisp.
Кто-нибудь может объяснить, что здесь происходит?
Спасибо.