我想在DLL中填充一个TStringList
。我的方法似乎与内存管理文档不符,但它可以工作,并且不会导致错误或AV。
有人能告诉我,这段代码是否正确吗?不确定我如何在一般情况下在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版本编译的,只调用虚拟方法。
结论: 只要使用虚拟方法或接口,就没有内存管理问题。这意味着,对象在哪里创建或释放都无所谓。