Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ComObject freigeben (https://www.delphipraxis.net/90781-comobject-freigeben.html)

EWeiss 23. Apr 2007 20:50


ComObject freigeben
 
Hi

Ein mit CreateComObject erstelltes objekt wie wird dieses unter Delphi
wieder freigegeben.

Delphi-Quellcode:
comObjType := CreateComObject(sCLSID) as IWMPEffects;
Reicht es wenn man
Delphi-Quellcode:
_IWMPEffects := nil;
setzt oder gibt es dafür einen speziellen Befehl.

EDIT:
Im moment verwende ich diese Funktion

Delphi-Quellcode:
function BASS_WMPVIS_Free(): boolean; stdcall;
begin

  if _IWMPEffects <> nil then
    begin
      try
        //_IWMPEffects._Release();
        _IWmpEffects := nil;
        Result := true;
      except
        Result := False;
      end;
    end else
      Result := true;

end;
Gebe ich das Obj über release frei dann crasht die Anwendung bei
_IWmpEffects := nil;

was wäre in dem Fall besser Release zu verwenden oder IWmpEffects auf nil zu setzen.
Ist in beiden fällen das object terminiert oder nicht ?

gruss Emil

mkinzler 23. Apr 2007 20:58

Re: ComObject freigeben
 
Zitat:

_IWmpEffects := Unassigned;

EWeiss 23. Apr 2007 21:02

Re: ComObject freigeben
 
Zitat:

Zitat von mkinzler
Zitat:

_IWmpEffects := Unassigned;

Da habe ich direkt wieder einen Fehler.
Für Unassigned muss ich ja die *.pas Variants einfügen da im projekt nicht vorhanden.

Das kommt dann dabei raus!
[Pascal Error] WMPUnit.pas(109): E2010 Incompatible types: 'IWMPEffects' and 'Variant'

gruss Emil

mkinzler 23. Apr 2007 21:04

Re: ComObject freigeben
 
Das funktioniert nur bei OleVariant.

mr2 23. Apr 2007 21:06

Re: ComObject freigeben
 
Delphi-Quellcode:
  _IWMPEffects := nil;
reicht vollkommen aus - der Delphi-Compiler generiert automatisch den _Release-Aufruf.
Unassigned sollte man nur verwenden, wenn man über späte Bindung (OleVariant) auf COM-Objekte zugreift.

mr2

EWeiss 23. Apr 2007 21:08

Re: ComObject freigeben
 
Zitat:

Zitat von mr2
Delphi-Quellcode:
  _IWMPEffects := nil;
reicht vollkommen aus - der Delphi-Compiler generiert automatisch den _Release-Aufruf.
Unassigned sollte man nur verwenden, wenn man über späte Bindung (OleVariant) auf COM-Objekte zugreift.

mr2

ahh ... dann brauche ich den Release aufruf nicht.
dann wars doch nicht so verkehrt.

Direkt noch eine kurze frage für die zukunft!
Was ist generell besser
Delphi-Quellcode:
if Assigned(_IWMPEffects) then
oder der aufruf
Delphi-Quellcode:
if _IWMPEffects <> nil then
grundsätzlich denke ich das gleiche. Oder?

gruss Emil

marabu 24. Apr 2007 06:19

Re: ComObject freigeben
 
Moin Emil,

verwende _Release() nur dann, wenn du vorher explizit auch _AddRef() verwendet hast.

Den Unterschied zwischen Assigned() und dem Vergleich mit nil kannst du im CPU-Fenster erkennen - es gibt keinen.

Freundliche Grüße

EWeiss 24. Apr 2007 07:09

Re: ComObject freigeben
 
Zitat:

Zitat von marabu
Moin Emil,

verwende _Release() nur dann, wenn du vorher explizit auch _AddRef() verwendet hast.

Den Unterschied zwischen Assigned() und dem Vergleich mit nil kannst du im CPU-Fenster erkennen - es gibt keinen.

Freundliche Grüße

Danke , dachte nur es würde einen unterschied machen
da mitunter bei dieser abfrage
if _IWMPEffects <> nil then

eher eine fehlermeldung ausgelößt wird als bei Assigned.
Glaube ich zumindest bemerkt zu haben.

gruss Emil

Ralf Kaiser 24. Apr 2007 07:32

Re: ComObject freigeben
 
Zitat:

Zitat von EWeiss

eher eine fehlermeldung ausgelößt wird als bei Assigned.
Glaube ich zumindest bemerkt zu haben.

gruss Emil

Nein, im Prinzip sind beide Abfragen gleich. Es gibt allerdings Situatuionen bei denen man nicht auf "= nil" testen kann: z.B. wenn man testen will ob ein Event bereits zugewiesen ist ("if Assigned(FOnClick) then...") da hier eine gehörige Portion "Compilermagie" im Spiel ist (Methodenzeiger bestehen ja eigentlich aus 2 Zeigern, einer aufs Objekt einer auf die Methode). Hier geht dann nur Assigned.

Ciao,
Ralf

Bernhard Geyer 24. Apr 2007 08:07

Re: ComObject freigeben
 
1, Delphi-COM-Technisch reicht es aus alle Referenzen auf nil zu setzen. Im Hintergrund werden alle nötigen _Release-Aufrufe getätigt

2, Diverse COM-Server benötigen aufgrund ihrer internen Implementierung noch zusätzliche Quit, Exit oder Close-Aufrufe um intern aufzuräumen. Dies ist aber eher eine designschwäche der entsprechenden COM-Server

3, Manche Komponenten (z.B. Internet-Explorer) benötigen Teilweise _Release-Aufrufe das sie intern zu fehlerhaft implementiert sind bzw. intern sehr oft zirkuläre Referenzen haben womit sich COM-Objekte gegenseitig am leben erhalten


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz