9

私が使用しているIDLのいくつかでは、メソッドで戻り値をマークするための2つの規則があることに気づきました-[in, out][out, retval]

[in, out]たとえば、次のように、複数の戻り値がある場合に使用されるようです。

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

[out, retval]たとえば、戻り値が1つしかない場合に使用されるようです。

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

これはCOMIDL規則ですか、それとも私が使用しているコードの規則ですか?

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

4

2 に答える 2

27

[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]としてマークできるのは、最後の 1 つのパラメーターのみ[out, retval]です。[in, out]パラメータを としてマークすることはできません[retval]

于 2009-10-16T05:02:36.450 に答える