VariantClear выпускает VT_DISPATCH -vs- документацию MSDN - PullRequest
0 голосов
/ 29 октября 2018

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.

Кто-нибудь может объяснить, что здесь происходит?

Спасибо.

...