我有一個DLL(A.dll)使用ATL的東西,並且不能有MFC。雖然有一些它需要的東西,但是我做了一個MFC regular DLL,名爲B.dll,它會在運行時由A.dll(通過導入庫)自動加載。普通的dll vs擴展dll
A需要的B.dll的一部分是在B.dll中定義的一個類(foo),並且該類有一些使用MFC的東西。我允許在A.dll中創建一個foo對象嗎? B需要是擴展DLL嗎?
的規則DLL頁說:
一個 常規DLL中的所有內存分配應留在 DLL內;該DLL不應該傳遞給或 從主叫可執行 收到以下的:
指針到MFC對象
指針到存儲器由MFC
分配但擴展DLL頁面說
客戶端可執行文件必須是使用_AFXDLL編譯的MFC應用程序,並且A.dll不能是MFC應用程序。
在這種情況下使用規則的DLL是否是一個問題?
感謝,
布萊恩
我最初有A創建一個在B中定義的MFC對象。我認爲這是什麼導致我的堆錯誤。我現在將其更改爲一個函數,其中對象的生命週期由B管理,並且A訪問通過導出的函數進行。 這不是一個COM對象。導入庫是由編譯器或鏈接器生成的.lib文件,或者當您將某些內容指定爲__declspec(dllexport)或def文件時生成的.lib文件。然後任何導入和導入庫的鏈接都會在運行時自動加載dll。 – bdwain
好的,這很清楚。是的,跨越dll邊界混合新/刪除有時會產生意想不到的結果。由於dll可能會與其他dll共享一個堆,並且在安裝CRT更新時,它開始使用自己的堆(取決於清單設置),從而加劇了這種情況。我認爲,通常的看法是,不要讓模塊釋放由另一個模塊分配的內存,換句話說,就像你說的,每個模塊都有自己的內存管理。如果我沒有記錯的話,使用_USRDLL/_AFXDLL的dll會有不同的堆,以執行特定於MFC的事情。 – Roel