Объясните пожалуйста, зачем приходится в IDL кроме указания у параметра метода аттрибута [out] еще добавлять и [retval]? Почему одного из них недостаточно?
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Объясните пожалуйста, зачем приходится в IDL кроме указания у параметра метода аттрибута [out] еще добавлять и [retval]? Почему одного из них недостаточно?
retval указывает, что параметр будет возвращаемы параметром.
out — параметров может быть несколько
а retval — один. Именно его и будет возвращать функция, например бейсиковская.
В бейсике, как ты знаешь, нет HRESULT. Методы возвращают то, что подписано как retval
Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>>Объясните пожалуйста, зачем приходится в IDL кроме указания у параметра метода аттрибута [out] еще добавлять и [retval]? Почему одного из них недостаточно?
PE> PE>retval указывает, что параметр будет возвращаемы параметром. PE>out — параметров может быть несколько PE>а retval — один. Именно его и будет возвращать функция, например бейсиковская. PE>В бейсике, как ты знаешь, нет HRESULT. Методы возвращают то, что подписано как retval
То есть, можно сделать вывод, что retval нужен для Васика и ему сочувствующих? То есть если я хочу сделать гадость чтобы тока из плюсов можно было достать этот метод то достаточно retval проскипать?
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>То есть, можно сделать вывод, что retval нужен для Васика и ему сочувствующих? То есть если я хочу сделать гадость чтобы тока из плюсов можно было достать этот метод то достаточно retval проскипать?
Не для Васика, а для Басика. Васик — VC.
Чтобы басик не видел, установи проперти всего метода hidden, restricted
Здравствуйте, Михаил Можаев, Вы писали:
ММ>Здравствуйте, Plutonia Experiment, Вы писали:
PE>>Чтобы басик не видел, установи проперти всего метода hidden, restricted
ММ>Ну а все таки, если "retval поскипать"? Тоже в Басике не пройдет? И если не пройдет, то с какими симптомами?
да можно скипать спокойно. вызов метода просто будет не такой :
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Куда ни глянь, все совершают доп. телодвижения, лишь бы Басиковцам жилось проще и лучше!
Чтобы потом, когда "Басиковцы" начнут пользовать твой компонент (а они не только начнут, но и, вполне возможно, их будет больше), тебе самому жилось проще и лучше (т.е. не было бы лишних вопросов "почему" и "зачем").
ДН>Объясните пожалуйста, зачем приходится в IDL кроме указания у параметра метода аттрибута [out] еще добавлять и [retval]? Почему одного из них недостаточно?
Потому, что таково требование СОМ для свойств (в частности 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);
Для того, чтобы позволить для некоторых (в том числе и С++) языков некоторый более естественный синтаксис операторов присваивания или вызова функции. А также для того, чтобы отличать вызов функции от вызова подпрограммы.
Информация = p.СделайЭтоИВерниОпределеннуюИнформацию(Параметр1, ..., ПараметрN) ' VB сиснтаксис
или
Информация = p->СделайЭтоИВерниОпределеннуюИнформацию(Параметр1, ..., ПараметрN)
Для того, чтобы не указавать такой параметр при вызове этой функции, если он не интересует.
p.СделайЭтоИВерниОпределеннуюИнформацию(Параметр1, ..., ПараметрN); // не VB сиснтаксис
или
p->СделайЭтоИВерниОпределеннуюИнформацию(Параметр1, ..., ПараметрN);
Для того, чтобы облегчить клиенту прием данных, а серверу передачу. Это вытекает из предыдущего. Например, в скриптах данные хранятся в виде VARIANTа, а сервер возвращает простые данные — числа и т.п. Поэтому скрипт (и VB в том числе) постарается "запихать" то, что сервер возвращает, к себе в данные. Ведь проще реализовать
[propget] HRESULT MyFunction([out,retval] short *outValue);
чем
[propget] HRESULT MyFunction([out,retval] VARIANT *outShortValue);
Для того, чтобы указать через какой параметр Invoke получать такой параметр. [out] и [out,retval] передаются в разных параметрах Invoke. Это не актуально для vtable-вызовов.