![]() |
ComObject freigeben
Hi
Ein mit CreateComObject erstelltes objekt wie wird dieses unter Delphi wieder freigegeben.
Delphi-Quellcode:
Reicht es wenn man
comObjType := CreateComObject(sCLSID) as IWMPEffects;
Delphi-Quellcode:
setzt oder gibt es dafür einen speziellen Befehl.
_IWMPEffects := nil;
EDIT: Im moment verwende ich diese Funktion
Delphi-Quellcode:
Gebe ich das Obj über release frei dann crasht die Anwendung bei
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; _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 |
Re: ComObject freigeben
Zitat:
|
Re: ComObject freigeben
Zitat:
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 |
Re: ComObject freigeben
Das funktioniert nur bei OleVariant.
|
Re: ComObject freigeben
Delphi-Quellcode:
reicht vollkommen aus - der Delphi-Compiler generiert automatisch den _Release-Aufruf.
_IWMPEffects := nil;
Unassigned sollte man nur verwenden, wenn man über späte Bindung (OleVariant) auf COM-Objekte zugreift. mr2 |
Re: ComObject freigeben
Zitat:
dann wars doch nicht so verkehrt. Direkt noch eine kurze frage für die zukunft! Was ist generell besser
Delphi-Quellcode:
oder der aufruf
if Assigned(_IWMPEffects) then
Delphi-Quellcode:
grundsätzlich denke ich das gleiche. Oder?
if _IWMPEffects <> nil then
gruss Emil |
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 |
Re: ComObject freigeben
Zitat:
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 |
Re: ComObject freigeben
Zitat:
Ciao, Ralf |
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 12:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz