AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ComObject freigeben

Ein Thema von EWeiss · begonnen am 23. Apr 2007 · letzter Beitrag vom 24. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

ComObject freigeben

  Alt 23. Apr 2007, 21:50
Hi

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

comObjType := CreateComObject(sCLSID) as IWMPEffects; Reicht es wenn man
_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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: ComObject freigeben

  Alt 23. Apr 2007, 21:58
Zitat:
_IWmpEffects := Unassigned;
Markus Kinzler
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: ComObject freigeben

  Alt 23. Apr 2007, 22:02
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: ComObject freigeben

  Alt 23. Apr 2007, 22:04
Das funktioniert nur bei OleVariant.
Markus Kinzler
  Mit Zitat antworten Zitat
mr2

Registriert seit: 3. Mai 2003
140 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: ComObject freigeben

  Alt 23. Apr 2007, 22:06
  _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
"... we know, there are known knowns; there are things we know we know. We also know there are known unknowns; that is to say we know there are some things we don't know. But there are also unknown unknowns - the ones we don't know we don't know."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: ComObject freigeben

  Alt 23. Apr 2007, 22:08
Zitat von mr2:
  _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
if Assigned(_IWMPEffects) then oder der aufruf
if _IWMPEffects <> nil then grundsätzlich denke ich das gleiche. Oder?

gruss Emil
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: ComObject freigeben

  Alt 24. Apr 2007, 07:19
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: ComObject freigeben

  Alt 24. Apr 2007, 08:09
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
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: ComObject freigeben

  Alt 24. Apr 2007, 08:32
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
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: ComObject freigeben

  Alt 24. Apr 2007, 09:07
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.
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