2009-10-16 37 views
8

私が扱うIDLの中には、メソッドに戻り値をマーキングするための2つの慣習があることに気がついています - [in, out][out, retval]COM IDL定義の[in、out]と[out、retval]の相違点

複数の戻り値がある場合[in, out]は、例えば、使用されると思われる:

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

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

単一の戻り値がある場合[out, retval]は、例えば、使用されると思われます

これはCOM IDLの規約ですか、それとも私が作業しているコードの慣例ですか?

2つの表記法から生成されるコードに機能的な違いがありますか、または完全に互換性がありますか?

答えて

23

[in, out]は、メソッドが呼び出されたときに有効な値が渡され、メソッドが成功を返したときに有効な値(ポインタが指す場所)があることを意味します。 [out]は、メソッドが呼び出されたときにどのような値でも指定できますが、メソッドが成功を返したときに有効になることを意味します。 [out][in, out]の両方のパラメータはポインタでなければならず、その値は変更されておらず、有効性要件はそれらが指す変数にのみ適用されます。

[out, retval]は、ネイティブCOMサポートラッパーを作成するときに、この非常にパラメータを戻り値に変換する必要があることを示す構文糖です。

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

のみ、最後の1つの[out]のパラメータ次のことができます。あなたはラッパーが、元のシグネチャを持つメソッドが含まれていますそれを[retval]をマークしていない場合は例えば

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

long IWrappedInterface::MyMethod(long* OutParam1); 

なり[out, retval]としてマークしてください。 [in, out]のパラメータには[retval]とマークすることはできません。

+0

有用な説明をありがとう。 – LeopardSkinPillBoxHat

+0

私は '[in、out]'がすべての言語(具体的にはold-school Visual Basic、.NETについては不明)で正しく処理されない可能性があると付け加えたいと思います。 –

+0

実行中にエラーが発生した場合にエラーコード(HRESULT)を取得する方法がないため、[out、retval]がCOMインターフェイスを定義するベストプラクティスに反しているのだろうか? – dave

0

もう1つの違いは、これがPIAの.NETコードでどのように表示されるかです。

[out、ret]は.NETで戻り値として表示されます。

[out]は、.NETのメソッドに引数を表示します。