私はメインアプリケーションを持っていて、タイプライブラリには2つのCOMオブジェクトがあり、1つはIFile、もう1つはIFilesです。 IFilesはIFileを作成し、TLISTに格納し、追加、削除などの標準的なメソッドを持っています.IFileとIFilesの両方がTAutoObjectです。何とかCOMオブジェクトインスタンスが失われる
IFilesの「追加」メソッドがうまくいけば、単にIFileオブジェクト[コード1]を作成し、それをTListに追加します。問題は、IFileオブジェクトのインスタンスが非常に奇妙な方法で失われることです。私はこのようなテスト・コードを有するメインアプリで[コード2]
[コード1]
function IFiles.Add(AFilename: String): IFile;
begin
Result := CoIFile.Create;
Result.Filename := AFilename;
// ShowMessage(IntToStr(Result._AddRef));
fFiles.Add(@Result);
end;
参照。 fFiles.Count = 4が、すべての内容が失われているにもかかわらず [コード2]第2ループから
var
i: Integer;
f: IFile;
Files: IFiles;
begin
Files := CoTIFile.Create;
for i:= 1 to 4 do
begin
// Create a dummy file object
f := Files.Add('Filename ' + IntToStr(i));
f._AddRef; // Not sure if AddRef works like this
// Prints out the last file
Memo1.Lines.Add(Files.Files[i-1].Filename);
end;
for i:= 0 to Files.Count-1 do
begin
f := Files.Files[i];
// F is nil at all time.
if (f<>nil) then Memo1.Lines.Add(f.Filename); // ! No print out.
end;
end;
、。 AddRefとReleaseを処理するためにIFileで特別な処理が必要ですか?または私が書いたIFiles.Addメソッドの方法が間違っていますか?
Aha。 TInterfaceList。 – Darkerstar