Was ist der richtige Weg, um eine Schnittstelle hinter einem OleVariant freizugeben?

8

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.

%Vor%

Ist diese Lösung sicher oder gibt es eine bessere Lösung, die ich übersehen habe?

    
Jens Mühlenhoff 19.07.2011, 10:33
quelle

1 Antwort

9

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.

%Vor%

Eine Alternative wäre, den Code, der CreateOleObject aufgerufen hat, in eine separate Routine mit einem eigenen Bereich zu verschieben.

%Vor%

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.

    
David Heffernan 19.07.2011, 10:41
quelle