代码之家  ›  专栏  ›  技术社区  ›  Zoli

VariantClear发布VT_DISPATCH-vs-MSDN文档

  •  0
  • Zoli  · 技术社区  · 7 年前

    VS2015 C++/WiDOWS7 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 关于VariantLear:

    如果要清除的变量是通过 参考,pvarg参数的VT字段是VT|u DISPATCH | VT_BYREF 或者VT|u UNKNOWN | VT|u BYREF。在这种情况下,VariantLear不会释放 物体。因为被清除的变量是指向 VariantClear无法确定对象是否为 必须释放该对象。因此,这是我们的责任 调用者根据情况选择是否释放对象。

    根据这一点,它不应该在IFontDisp上调用release。

    有人能解释一下这是怎么回事吗?

    谢谢

    0 回复  |  直到 7 年前
    推荐文章