gpt4 book ai didi

delphi - 在 DLL 中填充 TStringList

转载 作者:行者123 更新时间:2023-12-03 15:48:37 25 4
gpt4 key购买 nike

我想在 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 版本编译的,并且仅调用虚拟方法。

结论:
只要使用虚方法或接口(interface),内存管理就没有问题。这意味着,在何处创建或释放对象并不重要。

最佳答案

如果您想跨模块边界传递类,那么您需要使用运行时包链接到 RTL/VCL。这是确保 DLL 中的 TStringList 类与 EXE 中的完全相同的唯一方法。这是您当前方法的根本问题。另一方面,如果您已经使用运行时包链接到 RTL,那么就可以了。

如果您不想使用运行时包,那么您需要完全重新设计您的界面。您需要停止跨模块边界传递类。您可以使用接口(interface),但不能使用类。并且您需要控制内存分配,以确保内存始终在分配它的模块中释放。或者开始使用 ShareMem

关于delphi - 在 DLL 中填充 TStringList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11777592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com