Различия между [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 .Сеть.