我开发了一个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
}
堆冲突发生在存在代码块之前
为了跨exe/dll边界共享MFC对象,如CStringArray,您需要使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())在顶部属性设置环境。