Различия между [in, out] и [out, retval] в определениях COM IDL

в некоторых 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 или просто соглашение в коде, с которым я работаю?

Is существует функциональная разница в коде, который будет генерироваться из 2 обозначений, или они полностью взаимозаменяемы?

2 ответов


[in, out] означает, что при вызове метода передается допустимое значение и существует допустимое значение (где указывает указатель), когда метод возвращает успех. [out] означает, что указанное значение может быть любым, когда вызывается метод, но оно будет действительным, когда метод возвращает успех. Оба!--4--> и [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 );

только последний


другое различие заключается в том, как это будет отображаться в PIA в коде .NET.

[out, ret] будет отображаться как возвращаемое значение in .Сеть.

[out] отобразит аргумент метода in .Сеть.