com idl定義における[in、out] and [out、retval]の違い
質問
IDLの一部では、メソッドに戻り値をマークするための2つの規則があることに気付きました - [in, out]
と [out, retval]
.
それはそうです [in, out]
たとえば、複数の返品値がある場合に使用されます。
HRESULT MyMethod(
[in] long InputParam,
[in, out] long* OutputParam1,
[in, out] long* OutputParam2
);
それはそうです [out, retval]
たとえば、単一の返品値しかない場合に使用されます。
HRESULT MyMethod2(
[in] long InputParam,
[out, retval] long* OutputParam1
);
これはCom IDLコンベンションですか、それとも私が協力しているコードの単なるコンベンションですか?
2つの表記から生成されるコードに機能的な違いはありますか、それとも完全に交換可能ですか?
解決
[in, out]
メソッドが呼び出されたときに有効な値が渡され、メソッドが成功を返すときに有効な値(ポインターがポイントする場所)があることを意味します。 [out]
指摘された値は、メソッドが呼び出されたときに何でもできることを意味しますが、メソッドが成功を返すときに有効になります。両方 [out]
と [in, out]
パラメーターはポインターでなければなりません - それらの値は変化していない有効であり、有効性の要件は指す変数にのみ適用されます。
[out, retval]
ネイティブCOMサポートラッパーを作成する際に、この非常にパラメーターを戻り値に変換する必要があることを示す構文砂糖です。例えば
HRESULT MyMethod( [out] long* OutParam1, [out, retval] long* OutParam2 );
なります
long IWrappedInterface::MyMethod( long* OutParam1 );
マークしない場合 [retval]
ラッパーには、元の署名を備えたメソッドが含まれます。
HRESULT IWrappedInterface::MyMethod( long* OutParam1, long* OutParam2 );
最後のものだけ [out]
パラメーターはとしてマークできます [out, retval]
. [in, out]
パラメーターはとしてマークすることはできません [retval]
.
他のヒント
もう1つの違いは、これが.NETコードのPIAに表示される方法です。
out、ret]は.netの返品値として表示されます。
out]は、.netのメソッドに関する引数を表示します。