Ich versuche einen sicheren / deterministischen Weg zu finden, eine Schnittstelle freizugeben, die in einem OleVariant eingekapselt ist.
AFAICS Delphi veröffentlicht Interface-Referenzen am Ende einer Prozedur, aber in meinem Fall muss ich es früher machen, weil ich COM herunterfahren muss.
%Vor% Ich habe den OleVariant jedoch in eine zusätzliche Klasseninstanz eingefügt, die ich freigeben kann, bevor ich CoUninitialize
anrufe.
Ist diese Lösung sicher oder gibt es eine bessere Lösung, die ich übersehen habe?
Der Compiler verwendet eindeutig eine implizite lokale Schnittstellenvariable für den Rückgabewert von CreateOleObject
. Dies wird dann am Ende der Routine freigegeben, zu spät für Sie.
Es gibt ein paar Möglichkeiten, dies zu besiegen. Zuallererst könnten Sie explizit die IDispatch
-Schnittstellenreferenz angeben, die von CreateOleObject
zurückgegeben wird. Dies ermöglicht Ihnen, ihre Lebensdauer zu steuern.
Eine Alternative wäre, den Code, der CreateOleObject
aufgerufen hat, in eine separate Routine mit einem eigenen Bereich zu verschieben.
Da die implizite lokale Referenz im Bereich von DoWork
liegt, wird sie am Ende von DoWork
und daher vor der Ausführung von CoUninitialize
veröffentlicht.
Ich empfehle, die zweite Option zu verwenden, die sauberer ist und den Compiler zwingt, die Arbeit in Ihrem Namen zu erledigen.
Tags und Links delphi com finalization delphi-2007