Les différences entre les [in, out] et [out, retval] dans les définitions COM IDL

StackOverflow https://stackoverflow.com/questions/1575818

  •  21-09-2019
  •  | 
  •  

Question

Dans certains des IDL je travaille avec j'ai remarqué qu'il ya 2 conventions pour le marquage des valeurs de retour dans les méthodes -. [in, out] et [out, retval]

Il semble que [in, out] est utilisé lorsque plusieurs valeurs de retour, par exemple:

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

Il semble que [out, retval] est utilisé quand il n'y a qu'une seule valeur de retour, par exemple:

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

Est-ce une convention COM IDL ou tout simplement une convention dans le code, je travaille avec?

Y at-il une différence fonctionnelle dans le code qui sera généré à partir des 2 notations, ou sont-ils complètement interchangeables?

Était-ce utile?

La solution

[in, out] signifie qu'une valeur valide est transmise lorsque la méthode est appelée et une valeur valide est là (où le pointeur pointe) lorsque la méthode retourne succès. [out] signifie que la valeur pointée peut être ce que lorsque la méthode est appelée, mais il sera valable lorsque la méthode renvoie un succès. Les deux paramètres de [out] et [in, out] doivent être pointeurs - leurs valeurs ne changent pas et valides et les conditions de validité appliquent uniquement aux variables qu'ils pointent vers

.

[out, retval] est un sucre syntaxique pour indiquer que lors de la création d'une enveloppe de soutien natif COM ce paramètre très doit être converti en une valeur de retour. Par exemple

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

devient

long IWrappedInterface::MyMethod( long* OutParam1 );

Si vous ne marquez pas [retval] l'emballage contiendra une méthode avec la signature originale:

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

Seul le dernier paramètre [out] peut être marqué comme [out, retval]. paramètres [in, out] ne peuvent pas être marqués comme [retval].

Autres conseils

Une autre différence est la façon dont cela va apparaître dans un PIA dans le code .NET.

[out, ret] sera affiché comme une valeur de retour dans .NET.

[out] affiche un argument sur la méthode .NET.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top