Warum benützt du TList um eine Liste von Interfaces zu führen?
Das kann nämlich ganz leicht ins Auge gehen:
Delphi-Quellcode:
var
...
LDispatch: IDispatch;
begin
...
// hier wird der Zeiger, der in AList.Items[i] auf einen Interfacezeiger kopiert.
LDispatch:= UsedTicket_Type(AList.Items[i]) as IUsedTicket_Type;
...
// und spätestens hier gibt's Probleme!!
// LDispatch wird ungültig - die Referenzzählung schlägt zu und es wird unsichtbar
// _Release aufgerufen.
// Sollte das Interface vorher einen RefCount von 1 gehabt haben
// dann ist jetzt der RefCount = 0 und damit wird das Objekt freigegeben
end;
Damit das nicht passiert, solltest du
TInterfaceList anstelle von TList verwenden.
Mir ist auch nicht klar, weshalb du mit einem SafeArray arbeitest.
Ein Variantarray ist intern auch ein SafeArray; mit dem Vorteil, dass die ganzen interne Dinge
von Delphi gemanaged werden.
Delphi-Quellcode:
var
mein_array : OleVariant;
i : Integer;
begin
mein_array := VarArrayCreate([0, list.Count-1], varDispatch);
for i:=0 to list.count-1 do
mein_array[i] := list.Items[i] as IDispatch;