【问题标题】:How to free member (i.e BSTR, SAFEARRAY, VARIANT) of an IDL User Defined Structure which is encapsulated in a VARIANT?如何释放封装在 VARIANT 中的 IDL 用户定义结构的成员(即 BSTR、SAFEARRAY、VARIANT)?
【发布时间】:2011-02-09 08:53:33
【问题描述】:

我在 IDL 中定义了一个结构。该结构有以下成员:


{
    BSTR m_sFirst;
    BSTR m_sSecond;
    VARIANT m_vChildStruct; //This member encapsulate a sub structure 
    SAFEARRAY __RPC_FAR * m_saArray;
}CustomINFO;

我正在使用 CoTaskMemAlloc 为结构分配内存并将其封装在 Variant 中,如下所示:



vV->vt = VT_RECORD;
vV->pvRecord = pStruct; //Pointer of sturct
vV->pRecInfo = pRI; //RecordInfo Interface

调用 VariantClear 释放结构及其成员的内存是否足够? 会不会也放出IRecordInfo接口?

或者我必须手动获取封装的结构并自己释放每个成员,然后使用 CoTaskMemFree 释放结构。

谢谢

皮卡罗·德·沃西奥

【问题讨论】:

  • 您已经需要一个 IRecordInfo 用于“主”结构。为什么不直接声明子结构而不是使用变体?

标签: visual-c++ com mfc atl com+


【解决方案1】:

VariantClear 将调用IRecordInfo::Clear,这会释放结构成员持有的内存,但不会释放结构本身(这就是为什么您无法在[out] VARIANT 中正确返回结构的原因)。 IRecordInfo 也应该发布。

(“应该”的意思是“否则,很多现有的代码会被破坏/被破坏”)。

更多信息在这里:http://vcfaq.mvps.org/com/4.htm

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多