Discussion:
Problem mit OLE
(zu alt für eine Antwort)
Christian Schmitt
2019-08-01 02:41:19 UTC
Permalink
Hallo Leute,

ich habe gerade ein kleines Problem mit meiner DLL. Ich nutze in der DLL ein COM Objekt, welches im Unload-Event mit ComObj._Release; wieder freigegeben wird. Jetzt erhalte ich leider eine Exception beim beenden meines Programms und zwar noch nach dem Event OnDestroy des MainForm im Aufruf TApplication.Destroy der Unit VCL.Forms:

if FNeedToUninitialize then OleUninitialize;

Ich habe auch schon versucht mit OleInitialize und OleUninitialize herumzuspielen - ohne genau zu wissen was ich mache :-) - aber leider bleibt das ganze. Es sieht so aus, als würde die Exception auch nur im Debugger auftreten, ohne Debugger erhalte ich zumindest mal keine Meldung. Hat jemand eine Idee zumindest nach was ich suchen könnte? Was passiert denn mit OleUninitialize bzw. kann ich das Flag FNeedToUninitialize irgendwie beeinflussen?

Gruß
Björn Schreiber
2019-08-01 09:33:54 UTC
Permalink
Post by Christian Schmitt
ich habe gerade ein kleines Problem mit meiner DLL. Ich nutze in der DLL ein COM Objekt, welches im Unload-Event mit ComObj._Release; wieder freigegeben wird.
Ich habe jetzt schon länger nicht mehr mit OLE / COM Objekten
gearbeitet, aber AFAIR arbeiten COM Objekte mit Referenzzählern.
Die Methode _Release wird in der Regel nicht durch den Benutzer
direkt aufgerufen. Am Ende seiner Lebenszeit sollte die Freigabe
automatisch geschehen.
Wenn du unbedingt eine vorzeitige Freigabe erzwingen willst, so
solltest du NIL zuweisen anstatt Free oder _Release aufzurufen.


hth,
Björn
--
Björn Schreiber
DRIGUS Systeme GmbH
Christian Schmitt
2019-08-02 04:09:10 UTC
Permalink
Post by Björn Schreiber
Wenn du unbedingt eine vorzeitige Freigabe erzwingen willst, so
solltest du NIL zuweisen anstatt Free oder _Release aufzurufen.
Habe ich auch schon versucht, gleiches Ergebnis. Das komische: Rufe ich das COM Objekt in der Hauptanwendung, ist alles gut. Rufe ich das Objekt über die DLL auf, so gibt es den Crash. Auch wenn ich mich gar nicht um die Freigabe kümmere. Ich habe mir jetzt so beholfen, dass ich im OnDestroy Event des Hauptfensters ein OleInitialize aufrufe, dann ist alles gut. Mache ich damit etwas falsch?

Gruß
Björn Schreiber
2019-08-02 06:38:37 UTC
Permalink
Post by Christian Schmitt
Habe ich auch schon versucht, gleiches Ergebnis. Das komische: Rufe ich das COM Objekt in der Hauptanwendung, ist alles gut. Rufe ich das Objekt über die DLL auf, so gibt es den Crash. Auch wenn ich mich gar nicht um die Freigabe kümmere. Ich habe mir jetzt so beholfen, dass ich im OnDestroy Event des Hauptfensters ein OleInitialize aufrufe, dann ist alles gut. Mache ich damit etwas falsch?
Wenn du das COM Objekt zwischen deiner Hauptanwendung und deiner DLL
austauscht, so würde ich vermuten, dass irgendwo eine Referenz verloren
geht und es zu einer zu frühen Freigabe kommt.
Und wichtig ist auch, dass du OleUnitialize erst dann aufrufst, wenn
dein COM Objekt außerhalb des Scopes ist (z.B. im finalization Teil
einer Unit).

Aber ich bin da auch einfach zu lange raus.


Gruß,
Björn
--
Björn Schreiber
DRIGUS Systeme GmbH
Christian Schmitt
2019-08-06 07:17:20 UTC
Permalink
Post by Björn Schreiber
Wenn du das COM Objekt zwischen deiner Hauptanwendung und deiner DLL
austauscht, so würde ich vermuten, dass irgendwo eine Referenz verloren
geht und es zu einer zu frühen Freigabe kommt.
Ich tausche es eigentlich gar nicht aus, das ist ja was mich so stuzig macht. Die Hauptanwendung weiß eigentlich garnichts von dem COM Objekt
Post by Björn Schreiber
Und wichtig ist auch, dass du OleUnitialize erst dann aufrufst, wenn
dein COM Objekt außerhalb des Scopes ist (z.B. im finalization Teil
einer Unit).
Das macht die Hauptanwendung irgendwann selbt, im TApplication.OnDestroy Ereignis. Wie gesagt, wenn ich in meinem TForm.OnDestroy ein OLEIni ausführe, habe ich keine Fehlermeldung mehr.
Post by Björn Schreiber
Aber ich bin da auch einfach zu lange raus.
Trotdem Dank! :-)

Gruß

Lesen Sie weiter auf narkive:
Loading...