2009-10-16 12 views
8

In einigen der IDL Ich arbeite mit Ich habe festgestellt, dass es 2 Konventionen für die Markierung von Rückgabewerten in Methoden - [in, out] und [out, retval].Unterschiede zwischen [in, out] und [out, retval] in COM IDL Definitionen

Es scheint, dass [in, out] werden verwendet, wenn mehrere Rückgabewerte sind zum Beispiel:

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

Es scheint, dass [out, retval] verwendet wird, wenn es nur ein einziger Rückgabewert, zum Beispiel:

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

Ist dies eine COM IDL-Konvention oder nur eine Konvention in dem Code, mit dem ich arbeite?

Gibt es einen funktionalen Unterschied im Code, der aus den 2 Notationen generiert wird, oder sind sie vollständig austauschbar?

Antwort

23

[in, out] bedeutet, dass ein gültiger Wert übergeben wird, wenn die Methode aufgerufen wird und ein gültiger Wert vorhanden ist (wo der Zeiger zeigt), wenn die Methode Erfolg zurückgibt. [out] bedeutet, dass der Wert, auf den verwiesen wird, beim Aufruf der Methode beliebig sein kann, aber gültig ist, wenn die Methode erfolgreich ist. Die Parameter [out] und [in, out] müssen Zeiger sein, deren Werte unverändert und gültig sind und deren Gültigkeitsbedingungen nur für die Variablen gelten, auf die sie verweisen.

[out, retval] ist ein syntaktischer Zucker, der angibt, dass beim Erstellen eines nativen COM-Support-Wrappers dieser Parameter in einen Rückgabewert konvertiert werden sollte. Zum Beispiel

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

wird

long IWrappedInterface::MyMethod(long* OutParam1); 

Wenn Sie es nicht [retval] markieren wird der Wrapper eine Methode mit der Originalunterschrift enthalten:

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

Nur die letzten [out] Parameter können als [out, retval] markiert sein. [in, out] Parameter können nicht als [retval] markiert werden.

+0

Danke für die nützliche Erklärung. – LeopardSkinPillBoxHat

+0

Ich möchte hinzufügen, dass '[in, out]' möglicherweise nicht korrekt von allen Sprachen (genauer gesagt Old School Visual Basic, nicht sicher über .NET) behandelt werden. –

+0

Ich frage mich, ob [out, retval] ist gegen die beste Praxis, um COM-Schnittstellen zu definieren, da es keine Möglichkeit gibt, Fehlercode (HRESULT) zu erhalten, wenn die Ausführung fehlschlägt? – dave

0

Ein weiterer Unterschied ist, wie dies in einem PIA in .NET-Code angezeigt wird.

[out, ret] wird als Rückgabewert in .NET angezeigt.

[out] wird ein Argument für die Methode in .NET angezeigt.