Re: Немного о [out, retval]
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.04.03 11:47
Оценка: 78 (5)
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Объясните пожалуйста, зачем приходится в IDL кроме указания у параметра метода аттрибута [out] еще добавлять и [retval]? Почему одного из них недостаточно?

  1. Потому, что таково требование СОМ для свойств (в частности Get-аксессор [propget]).

    A function that has the propget attribute should also have, as its last parameter, a pointer type with the [out] and [retval] attributes. If the last parameter does not have the [out, retval] attributes, the return value of the function is treated as an [out, retval] parameter. For example, a function with the prototype

    [propget] short MyFunction([in] long aLongValue);
    is treated as
    [propget] HRESULT MyFunction([in] long aLongValue, [out,retval] short *outValue);

  2. Для того, чтобы позволить для некоторых (в том числе и С++) языков некоторый более естественный синтаксис операторов присваивания или вызова функции. А также для того, чтобы отличать вызов функции от вызова подпрограммы.
      Информация = p.СделайЭтоИВерниОпределеннуюИнформацию(Параметр1, ..., ПараметрN) ' VB сиснтаксис
    или
      Информация = p->СделайЭтоИВерниОпределеннуюИнформацию(Параметр1, ..., ПараметрN)

  3. Для того, чтобы не указавать такой параметр при вызове этой функции, если он не интересует.
      p.СделайЭтоИВерниОпределеннуюИнформацию(Параметр1, ..., ПараметрN); // не VB сиснтаксис
    или
      p->СделайЭтоИВерниОпределеннуюИнформацию(Параметр1, ..., ПараметрN);

  4. Для того, чтобы облегчить клиенту прием данных, а серверу передачу. Это вытекает из предыдущего. Например, в скриптах данные хранятся в виде VARIANTа, а сервер возвращает простые данные — числа и т.п. Поэтому скрипт (и VB в том числе) постарается "запихать" то, что сервер возвращает, к себе в данные. Ведь проще реализовать
    [propget] HRESULT MyFunction([out,retval] short *outValue);
    чем
    [propget] HRESULT MyFunction([out,retval] VARIANT *outShortValue);

  5. Для того, чтобы указать через какой параметр Invoke получать такой параметр. [out] и [out,retval] передаются в разных параметрах Invoke. Это не актуально для vtable-вызовов.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.