2011-09-05 87 views
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 
} 

堆冲突发生时只是现有的代码块

回答

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())在顶部的属性来设置外部调用时的环境。

+0

将配置更改为MFC Extension做了这项工作。 我不得不改变的另一件事是功能声明必须从以下内容更改: – Dan

+0

将配置更改为MFC扩展完成了这项工作。还有一件事我不得不改变,就是将导出的函数声明为:long __declspec(dllexport)to:extern“C”__declspec(dllexport)long来解决可执行端的链接错误。此外,AFX_MANAGE_STATE(AfxGetStaticModuleState())已从dll代码中删除。 – Dan