如何在另一个SAFEARRAY中释放SAFEARRAY

时间:2014-04-03 07:02:37

标签: .net com mfc interop safearray

我使用MFC / C ++中的.NET组件通过COM接口(使用.NET Interop)。该接口包含包含数组的结构(在COM中产生SAFEARRAYS)。

我无法以正确的方式释放SAFEARRAY。运行应用程序时,应用程序将在第二个SafeArrayDestroy崩溃。那么,当删除外部SAFAARRAY时,是否会删除内部SAFEARRAY? 还有其他想法吗?

谢谢!

C#界面如下所示:

public struct structVersionCondition
{
    public Int32 m_val;
}
public struct structVersion
{
    public structVersionCondition[] m_VersionConditions;
}
public struct structVersions
{
    public structVersion[] m_Version;
}

public interface TextStore_Interface
{
    [DispId(1)]
    bool GetVersionRef(out structVersions versions);
}

从MFC / C ++调用生成的COM IF,如下所示:

m_pIF->GetVersionRef(&ver, &retVal);
SafeArrayAccessData(ver.m_Version, (void**)&pValsOuter);
//..Get Lower and Upper bound calculate number of elements
for (int i=0; i<elem_no; ++i){
    SafeArrayAccessData(pValsOuter[i].m_VersionConditions, (void**)&pValsInner);
    //operate on the structVersionCondition[] SAFEARRAY trough pValsInner
    SafeArrayUnaccessData(pValsOuter[i].m_VersionConditions);
    SafeArrayDestroy(pValsOuter[i].m_VersionConditions);
}
SafeArrayUnaccessData(ver.m_Version);
SafeArrayDestroy(ver.m_Version); //Exception is thrown here!

此致 约翰

1 个答案:

答案 0 :(得分:0)

据我所知,我了解SafeArrayDestroy函数,您不负责释放存储在SafeArray中的数组。

SafeArrayDestroy释放与其存储成员关联的所有内存。它就像存储在SafeArray中的VARIANT一样。 VariantClear被调用。还发布了IDispatch指针。

SafeAray以正确的方式处理所有COM类型。

但实际上:我从没试过你。当我将数据嵌套在SafeArray中时,我总是使用VARIANT。

文档不是很清楚:SafeArrayDestroy

  

销毁现有的数组描述符和所有数据   阵列。如果对象存储在数组中,则会在每个对象上调用Release   数组中的对象。

  

变量的安全数组将调用VariantClear函数   BSTR的每个成员和安全数组都将具有SysFreeString   调用每个元素的函数。 IRecordInfo :: RecordClear将是   调用以释放对象引用和记录的其他值   没有取消分配记录。