Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Objekte zw. Programm und DLL austauschen - Interfaces?

  Alt 6. Sep 2008, 20:35
Delphis XMLDocument ist bereits interface-basiert: IXmlDocument.
Was du beachten musst ist, dass die Lebensdauer von Interfaces durch Referenzzählung verwaltet wird.
Wenn du einer Interface variable ein Objekt zuweist, dann wird dessen Zähler erhöht, aber wenn du aus den Scope rennst, dann wird er wieder um 1 reduziert.
Erreicht er 0 wird die Instanz vernichtet.

IOW: Wenn du ein Objekt überall als Klasse, nicht Interface, nutzt, dann könnte eine einmalige Zuweisung zu einer Interface instanz dieses Objekt zerstören wenn du die Methode verlässt.

Ein Trick wäre den Referenzzähler künstlich um 1 zu erhöhen. (_AddRef)
Wenn du es nur als Parameter übergibst, kannst du diesen auch als "const" deklarieren. Genau wie bei AnsiString wird dabei die Referenzzählung ignoriert.

Hier passiert nix:
Delphi-Quellcode:
procedure Miep.DoSomething(const instance : ISomeInterface);
begin
  instance.SomeMethod();
end;
Das hier ist aber GANZ böse:
Delphi-Quellcode:
procedure Miep.DoSomething(const instance : ISomeInterface);
var
  tmp : ISomeInterface;
begin
  tmp : instance;
end;
Wenn du in DoSomething ein Objekt wirfst, dann wird beim Zuweisen zu tmp der Referenzzähler auf 1 erhöht. Beim Verlassen der Methode aber reduziert und dadurch wird das Objekt zerstört.
Du kannst dem generell entgegenwirken, wenn du dafür sorgst, dass der Zäher immer mindestens 1 ist. Das erreichst du wenn du einmal _AddRef auf die Instanz ausführst.

Die coolste Lösung ist gar keine Objektreferenzen von diesen Instanzen zu benutzen. Weder in der Exe noch in ener DLL. Dadurch funktioniert die Referenziertzählung überall und Objekte werden autom. freigegeben.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat