从 DLL 导出函数释放 CStringArray&参数时的堆冲突



我开发了一个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())在顶部属性设置环境。

相关内容

  • 没有找到相关文章

最新更新