我已经开发了一个MFC函数,其中包含一个具有此原型的函数:
//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中)完成的。 尽pipe我使用相同的环境设置编译了两个应用程序(Exe和Dll),但在debugging模式和两种发行模式下,我仍然遇到这个问题。 我该如何解决这个问题?
//Executable code { CStringArray arrData; GetData("Identifier",arrData); //data is accesible }
在现有代码块之前发生堆违例
为了跨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(AfxGetStaticmoduleeState())来设置外部调用的环境。