2009-10-16 5 views
8

В некоторых IDL, с которыми я работаю, я заметил, что существуют два соглашения для маркировки возвращаемых значений в методах - [in, out] и [out, retval].Различия между [in, out] и [out, retval] в определениях COM IDL

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

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

ответ

23

[in, out] означает, что действительное значение передается при вызове метода, и существует допустимое значение (где указывает указатель), когда метод возвращает успех. [out] означает, что указанное значение может быть любым, когда вызывается метод, но он будет действителен, когда метод возвращает успех. Оба параметра [out] и [in, out] должны быть указателями - их значения не изменяются и действительны, а требования к действительности применяются только к переменным, на которые они указывают.

[out, retval] является синтаксическим сахаром, указывающим на то, что при создании обертки Native COM Support этот самый параметр должен быть преобразован в возвращаемое значение. Например

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].

+0

Спасибо за полезное объяснение. – LeopardSkinPillBoxHat

+0

Я хотел бы добавить, что '[in, out]' может не обрабатываться корректно на всех языках (более конкретно, в Visual Basic для старой школы, не уверен в .NET). –

+0

Мне интересно, если [out, retval] против лучшей практики для определения COM-интерфейсов, поскольку нет способа получить код ошибки (HRESULT), если выполнение не выполняется? – dave

0

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

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

[out] покажет аргумент метода в .NET.