tenemos la siguiente interfaz:¿El servidor COM tiene que llamar a SysFreeString() para un parámetro [out]?
[object, uuid("uuidhere"), dual ]
interface IInterface : IDispatch
{
[id(1), propget] HRESULT CoolProperty([out, retval] BSTR* result);
}
Ahora hay un problema menor. Por un lado, el parámetro está "fuera" y, por lo tanto, cualquier valor puede pasarse como entrada, el parámetro será válido solo después de la devolución exitosa. Por otro lado, hay this MSDN article que está enlazado desde muchas páginas que básicamente dice (el último párrafo) que si alguna función se pasa a BSTR*
debe liberar la cadena antes de asignar una nueva cadena.
Eso es horrible. Si ese artículo es correcto, significa que todas las personas que llaman seguramente deben pasar BSTR válidos (quizás BSTR nulos), de lo contrario BSTR pasado se puede filtrar. Si la persona que llama pasó un valor aleatorio y el destinatario intenta llamar al SysFreeString()
, se ejecuta en un comportamiento no definido, por lo que la convención es crítica.
Entonces, ¿cuál es el punto en el atributo [out]
? ¿Cuál será la diferencia entre [in, out]
y [out]
en esta situación?
¿Ese artículo es correcto? ¿Debo liberar el parámetro BSTR [out]
pasado antes de asignar uno nuevo?