VariantClear发布VT_DISPATCH -vs- MSDN文档

时间:2018-10-29 09:37:08

标签: winapi assembly msdn variant idispatch

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 doc关于VariantClear的信息:

  

如果要清除的变体是通过的COM对象   参考,pvargparameter的vtfield是VT_DISPATCH | VT_BYREF   或VT_UNKNOWN | VT_BYREF。在这种情况下,VariantClear不会释放   物体。因为要清除的变体是指向   引用对象时,VariantClear无法确定它是否为   释放对象所必需。因此,这是   调用方是否根据需要释放对象。

因此,它不应在IFontDisp上调用release。

有人可以解释这里发生了什么吗?

谢谢。

0 个答案:

没有答案