释放CStringArray&时发生违规DLL导出函数的参数

时间:2011-09-05 14:12:26

标签: c++ windows dll heap dllexport

我开发了一个包含具有此原型的函数的MFC dll:

//DLL code
long __declspec(dllexport) GetData(CString csIdentifier, CStringArray& arrOfData)
{
    //based on the identifier I must add some strings inside the string array
    arrOfData.Add("...");
    arrOfData.Add("...");
    /*.....................*/
    return 1;
}

我遇到的问题是在调用函数之后(从可执行文件中调用)。将调用arrData的析构函数并尝试释放内存,但它不会成功,因为 arrOfData 的分配是在另一个堆(在dll内)完成的。虽然我已经使用相同的环境设置编译了两个应用程序(Exe和Dll),但我仍然在调试和两种发布模式中都存在问题。我该如何解决这个问题?

//Executable code
{
    CStringArray arrData;
    GetData("Identifier",arrData);
    //data is accesible
}
在存在代码块之前发生

堆违规

1 个答案:

答案 0 :(得分:1)

为了跨越exe / dll边界共享像CStringArray这样的MFC对象,您需要使DLL成为MFC扩展DLL。请参阅:https://msdn.microsoft.com/en-us/library/h5f7ck28(v=vs.140).aspx

关于内存管理部分:

  

MFCx0.dll和加载到客户端应用程序地址空间的所有扩展DLL使用相同的内存分配器,资源加载和其他MFC全局状态,就好像它们位于同一个应用程序中一样。这很重要,因为非MFC DLL库和常规DLL完全相反,并且每个DLL都从其自己的内存池中分配。

在外部调用时,你的DLL函数也可能需要AFX_MANAGE_STATE(AfxGetStaticModuleState())在属性的顶部设置环境。

相关问题