我想TStringList
在一个DLL里面填一个。关于内存管理文档,我的方法似乎是错误的,但它有效并且不会导致错误或 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 版本编译的,并且只调用了虚拟方法。
结论:
只要使用虚拟方法或接口,内存管理没有问题。这意味着,在哪里创建或释放对象并不重要。