首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在另一个SAFEARRAY中释放SAFEARRAY

如何在另一个SAFEARRAY中释放SAFEARRAY
EN

Stack Overflow用户
提问于 2014-04-03 07:02:37
回答 1查看 1.4K关注 0票数 1

我通过COM接口使用来自MFC/C++的.NET组件(使用.NET互操作)。接口包含包含数组的结构(导致COM中的SAFEARRAYS )。

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

谢谢!

C#接口如下所示:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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!

问候约翰

EN

回答 1

Stack Overflow用户

发布于 2014-04-03 07:52:27

据我所见,并且我理解SafeArrayDestroy函数,您不负责释放存储在SafeArray中的数组。

SafeArrayDestroy释放与其存储成员关联的所有内存。它类似于存储在SafeArray中的变体。VariantClear被称为。此外,还释放了IDispatch指针。

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

但事实上:我从来没有试过你建造。当数据嵌套在SafeArray中时,我总是使用变体。

文档不太清楚:SafeArrayDestroy

破坏现有的数组描述符和数组中的所有数据。如果对象存储在数组中,则对数组中的每个对象调用Release。

变量的安全数组将在每个成员上调用VariantClear函数,而BSTR的安全数组将在每个元素上调用SysFreeString函数。IRecordInfo::RecordClear将被调用以释放对象引用和记录的其他值,而不会释放记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22830168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档