Ich habe eine Haupt-App und eine Typbibliothek enthält 2 COM-Objekte, eines ist IFile, eines ist IFiles. IFiles erstellt IFile und speichert sie in einem TLIST und verfügt über Standardmethoden wie Hinzufügen, Entfernen usw. Sowohl IFile als auch IFiles sind TAutoObject.Irgendwie COM Objektinstanz wird verloren
"Add" -Methode in IFiles funktioniert gut, es erstellt einfach IFile-Objekt [Code 1], und fügt es zu TList. Problem ist, wenn die Objektinstanz auf sehr seltsame Weise verloren geht. siehe [Code 2]
[Code 1]
function IFiles.Add(AFilename: String): IFile;
begin
Result := CoIFile.Create;
Result.Filename := AFilename;
// ShowMessage(IntToStr(Result._AddRef));
fFiles.Add(@Result);
end;
Im Haupt app Ich habe Testcode wie diese. [Code 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;
Vom 2. Schleife, obwohl fFiles.Count = 4, aber alle Inhalte verloren haben. Benötige ich eine zusätzliche Behandlung in IFile, um mit AddRef und Release umzugehen? oder wie IFiles.Add Methode, die ich schrieb, falsch ist?
Aha. TInterfaceList. – Darkerstar