我想在一個DLL中填充一個TStringList
。我的方法在內存管理文檔中似乎是錯誤的,但它的工作原理並不會導致錯誤或AV。在一個DLL中填充一個TStringList
有人可以告訴我,如果該代碼是好的?不知道我怎樣才能在一個DLL中填充一個類。
programm EXE
function MyClass_Create: IMyClass; stdcall; external ...
var
_myClass_DLL: IMyClass; //shared interface in exe and dll
procedure FillList;
var
list: TStringList;
begin
list := TStringList.Create(true); //memory allocated in EXE
try
_myClass_DLL.FillList(list); //memory allocated in DLL???
ShowMessage(list.Text);
finally
list.Free; //memory freed in EXE, frees also TObject created in DLL
end;
end;
DLL代碼:
library DLL
TMyClass = class(TInterfacedObject, IMyClass)
public
procedure FillList(aList: TStringList);
end;
procedure TMyClass.FillList(aList: TStringList);
begin
aList.AddObject('Text1', TObject.Create); //memory allocation in DLL?
aList.AddObject('Text2', TObject.Create); //memory allocation in DLL?
end;
我不使用BORLNDMM.DLL或任何其他ShareMem單元。
編輯:
我擴大了aList.Add()
調用aList.AddObject()
。它也不會崩潰,儘管TObject在DLL中創建並在EXE中釋放。
答:
關於在下面的接受的答案的評論,該代碼是正確的,因爲EXE和DLL與同一版本的Delphi編譯的,只有虛擬methodes被調用。
結論:
只要使用虛擬方法或接口,存在與存儲器管理沒有問題。這意味着,創建或釋放對象的位置並不重要。
這是否意味着,我必須設置標誌 「使用運行時包」 中該exe程序的項目設置?或者它只是足以將一個包中的DLL轉換? – 2012-08-02 13:54:59
在上面的代碼中,您只需鏈接到RTL/VCL運行時軟件包。如果您想傳遞您在兩個模塊之間實現的類,那麼您需要將DLL轉換爲一個包。 – 2012-08-02 13:56:31
我對包裝不熟悉。然後,我可以以與dll相同的方式加載軟件包嗎?例如「函數MyClass_Create:IMyClass; stdcall; external'myPackage.bpl'」 – 2012-08-02 14:13:03