質問

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のメソッドに関する引数を表示します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top