2010-04-28 10 views
5

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?

Respuesta

4

Debería esperar que el cliente cumpla con el contrato, respete el atributo [out] y no pase un BSTR inicializado que debe liberarse. Verificación doble y esperar un NULO es no bien, el contrato no requiere que el cliente pase un puntero a una ubicación de memoria inicializada. Lo más normal es obtener un puntero a una variable BSTR asignada en el marco de la pila. Es probable que contenga basura aleatoria, solo un programador defensivo la establecería en NULL.

De lo contrario, no es compatible con la automatización OLE. Solo [out, retval] y [in, out] son ​​válidos en este caso, sin duda para evitar esta trampa en particular.

3

El documentation indica que los punteros de salida nunca deben ser liberados por el destinatario así que, en mi humilde opinión, sería mejor cumplir con la especificación.

Mejor

Cuestiones relacionadas