【发布时间】:2014-05-14 20:11:05
【问题描述】:
我正在通过 COM 接口(使用 .NET Interop)使用 MFC/C++ 中的 .NET 组件。该接口包含包含数组的结构(导致 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!
问候 约翰
【问题讨论】:
-
您破坏了 m_VersionConditions 数组,但忘记将指针设置为 NULL。所以销毁 m_Version 会再次尝试销毁内部数组。卡布姆。
-
在调用 SafeArrayDestroy 后将 SAFEARRAY 指针设置为 NULL,似乎可以解决问题!非常感谢......
标签: .net com mfc interop safearray