1

我开发了一个 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
}

堆冲突发生在代码块存在之前

4

1 回答 1

1

为了跨 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()) 来在外部调用时设置环境。

于 2011-09-05T17:26:17.140 回答