2011-09-05 66 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