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?