Thema: Delphi SafeArrayPutElement

Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: SafeArrayPutElement

  Alt 26. Mai 2009, 07:59
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;
  Mit Zitat antworten Zitat