【发布时间】:2011-12-02 04:20:58
【问题描述】:
我有一个主应用程序,一个类型库包含 2 个 COM 对象,一个是 IFile,一个是 IFiles。 IFiles 创建 IFile,并将它们存储在 TLIST 中,并具有 Add、Remove 等标准方法。IFile 和 IFiles 都是 TAutoObject。
IFiles 中的“Add”方法工作正常,它只是创建 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;
在主应用程序中,我有这样的测试代码。 [代码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;
从第二个循环开始,即使 fFiles.Count = 4,但所有内容都丢失了。我是否需要在 IFile 中进行一些额外的处理来处理 AddRef 和 Release?还是我写的 IFiles.Add 方法不对?
【问题讨论】: