2010-04-28 5 views
5

Wir haben die folgende Schnittstelle:Muss der COM-Server SysFreeString() für einen Parameter [out] aufrufen?

[object, uuid("uuidhere"), dual ] 
interface IInterface : IDispatch 
{ 
    [id(1), propget] HRESULT CoolProperty([out, retval] BSTR* result); 
} 

Jetzt gibt es ein kleines Problem. Auf der einen Seite ist der Parameter "out" und so kann jeder Wert als Eingabe übergeben werden, der Parameter wird erst bei der erfolgreichen Rückgabe gültig. Auf der anderen Seite gibt es this MSDN article, die mit vielen Seiten verlinkt ist, die grundsätzlich (der letzte Absatz) besagt, dass, wenn eine Funktion übergeben wird, eine BSTR* die Zeichenfolge freigeben muss, bevor eine neue Zeichenfolge zugewiesen wird.

Das ist erschreckend. Wenn dieser Artikel richtig ist, bedeutet dies, dass alle Anrufer sicher gültige BSTRs (möglicherweise Null BSTRs) übergeben müssen, sonst kann BSTR weitergegeben werden. Wenn der Aufrufer einen zufälligen Wert übergeben hat und der Angerufene versucht, SysFreeString() aufzurufen, tritt ein undefiniertes Verhalten auf, so dass die Konvention kritisch ist.

Dann was ist der Punkt in der [out] Attribut? Was ist der Unterschied zwischen [in, out] und [out] in dieser Situation?

Ist dieser Artikel richtig? Muss ich den übergebenen BSTR [out] Parameter freigeben, bevor ich einen neuen erstelle?

Antwort

4

Sie sollten erwarten, dass der Client dem Vertrag folgt, das [out] -Attribut berücksichtigt und keinen initialisierten BSTR weitergibt, der freigegeben werden muss. Doppelte Überprüfung und erwartet eine Null ist nicht okay, der Vertrag erfordert nicht den Client einen Zeiger auf einen initialisierten Speicherort übergeben. Normalerweise erhalten Sie einen Zeiger auf eine BSTR-Variable, die auf dem Stapelrahmen zugewiesen ist. Es wird wahrscheinlich zufälligen Müll enthalten, nur ein defensiver Programmierer würde es auf NULL setzen.

Es ist nicht kompatibel mit OLE Automation. Nur [out, retval] und [in, out] sind in diesem Fall gültig, um diese besondere Falle zu umgehen.

3

Die documentation besagt, dass OUT-Zeiger nie durch den Aufrufer freigegeben werden sollten, also, IMHO, würden Sie besser die Spezifikation einhalten.

Beste

Verwandte Themen