不知何故COM对象实例丢失了

Dar*_*tar 1 delphi com

我有一个主应用程序和一个类型库包含2个COM对象,一个是IFile,一个是IFiles.IFiles创建IFile,并将它们存储在TLIST中,并具有标准方法,如Add,Remove等.IFile和IFiles都是TAutoObject.

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;
Run Code Online (Sandbox Code Playgroud)

在主应用程序中,我有这样的测试代码.[代码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;
Run Code Online (Sandbox Code Playgroud)

从第二个循环开始,即使fFiles.Count = 4,但所有内容都丢失了.我是否需要在IFile中进行一些额外的处理来处理AddRef和Release?或者我写的IFiles.Add方法错了?

Tob*_*len 8

尝试使用TInterfaceList而不是TList来存储IFile的实例.这可以解决您的问题.