2010-09-14 18 views
2

我試圖從dll函數返回我自己的對象(從TCollection派生)。我使用FastMemoryManager,但沒有成功...所以我試圖返回一些對象的動態數組。
當然在dll函數中設置數組的長度。 它工作很好,但分配的內存不釋放。
(我用Windows tarsk管理器測量)。有沒有可能如何釋放動態數組? ,其調用的DLL功能是在線程,並且在最後,我有如下的步驟:返回TCollection或從DLL的對象數組

for i := 0 to length(MyObjectArray) - 1 do begin 
    if MyObjectArray[i] <> nil then 
    MyObjectArray[i].Free; 
end; 
Setlength(MyObjectArray, 0); 
MyObjectArray := nil; 

如果我用Setlength代替(MyObjectArray,0)和MyObjectArray:=零,
FreeAndNil (MyObjectArray)引發異常。

什麼建議嗎?

+0

從你[上一個問題](http://stackoverflow.com/questions/3529039/delphi-plugin-framework),我以爲你會決定*不*使用DLL。是什麼讓你決定使用它們呢? – 2010-09-14 14:26:53

+0

這個問題與其他一些項目有關,要簡單得多。我只是想將一些函數從exe移到dll,而不在它們之間傳輸大數據。我的另一個問題,你在你的評論中提到的,關注於項目,我需要TFrames和TForms作爲MDI孩子等嵌入到主應用中。所以BPL或其他替代品仍然是實際的;) – Peter 2010-09-14 16:27:51

回答

6

ShareMem是所有Delphi DLL和EXE項目文件中的第一個單元嗎? FastMM已經是Delphi過去幾個版本的RTL內存管理器。

我建議不要在DLL和EXE之間共享對象;這只是一個痛苦的祕訣。改用軟件包。

如果您必須使用DLL,我建議採用通常的WinAPI約定:stdcall調用約定,僅使用C兼容的數據類型(整數,浮點數,指針,沒有託管類型字段的記錄,如字符串,數組或接口)。讓DLL不分配EXE負責釋放的內存。相反,讓EXE分配並傳遞DLL的內存;或者,將分配封裝到邏輯句柄中,並且輸出從DLL中排除存儲器的函數,例如, WinAPI函數如何工作。