TStringList
DLL の内部を埋めたい。私のアプローチはメモリ管理のドキュメントに関して間違っているようですが、それは機能し、エラーや AV を引き起こしません。
そのコードがOKなら、誰か教えてもらえますか? 一般に、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 ユニットは使用していません。
編集:呼び出しを
に拡張しました。また、TObject は DLL で作成され、EXE で解放されますが、クラッシュしません。aList.Add()
aList.AddObject()
回答:
以下の受け入れられた回答のコメントについては、exe と dll が同じ Delphi バージョンでコンパイルされ、仮想メソッドのみが呼び出されるため、そのコードは正しいです。
結論:
仮想メソッドまたはインターフェイスが使用されている限り、メモリ管理に問題はありません。つまり、オブジェクトがどこで作成または解放されるかは問題ではありません。