2009-10-16 10 views
8

En algunos de los IDL con los que trabajo, he notado que hay 2 convenciones para marcar valores devueltos en métodos - [in, out] y [out, retval].Diferencias entre [in, out] y [out, retval] en definiciones COM IDL

Parece que [in, out] se usa cuando hay múltiples valores de retorno, por ejemplo:

HRESULT MyMethod(
    [in] long InputParam, 
    [in, out] long* OutputParam1, 
    [in, out] long* OutputParam2 
); 

Parece que [out, retval] se utiliza cuando sólo hay un único valor de retorno, por ejemplo:

HRESULT MyMethod2(
    [in] long InputParam, 
    [out, retval] long* OutputParam1 
); 

¿Es esta una convención COM IDL o simplemente una convención en el código con el que estoy trabajando?

¿Hay una diferencia funcional en el código que se generan a partir de las 2 anotaciones, o son completamente intercambiables?

Respuesta

23

[in, out] significa que un valor válido se pasa cuando se llama al método y un valor válido está ahí (en la que apunta el puntero) cuando el método devuelve éxito. [out] significa que el valor apuntado puede ser cualquiera cuando se llama al método, pero será válido cuando el método devuelva éxito. Ambos [out] y [in, out] parámetros deben ser punteros - sus valores son válidos sin cambios y los requisitos de validez y sólo se aplican a las variables que apuntan.

[out, retval] es un azucar sintáctico para indicar que al crear una envoltura de soporte COM nativo este mismo parámetro debe convertirse a un valor de retorno. Por ejemplo

HRESULT MyMethod([out] long* OutParam1, [out, retval] long* OutParam2); 

convierte

long IWrappedInterface::MyMethod(long* OutParam1); 

Si no lo marca [retval] la envoltura contendrá un método con la firma original:

HRESULT IWrappedInterface::MyMethod(long* OutParam1, long* OutParam2); 

Sólo el último parámetro puede [out] estar marcado como [out, retval]. Los parámetros [in, out] no se pueden marcar como [retval].

+0

Gracias por la útil explicación. – LeopardSkinPillBoxHat

+0

Me gustaría agregar que '[in, out]' puede no ser manejado correctamente por todos los idiomas (más específicamente, en la vieja escuela de Visual Basic, no estoy seguro acerca de .NET). –

+0

Me pregunto si [out, retval] está en contra de las mejores prácticas para definir interfaces COM ya que no hay forma de obtener el código de error (HRESULT) si la ejecución falla. – dave

0

Otra diferencia es la forma en que se muestre en un PIA en el código .NET.

[a cabo, ret] se mostrará como un valor de retorno en .NET.

[a cabo] se mostrará una discusión sobre el método en .NET.

Cuestiones relacionadas