Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 10:21
Оценка:
Привет всем!!!
Вообщем вопрос в следующем:
Есть asp страница, в которой используется VBScript, и вызывется метод COM обьекта:

[id(14), helpstring("method Get")] HRESULT Get([in] BSTR szSession, [in] long nHierarchyID, [in] long nLocationID, [in] long nPropertyValueID, [in] long nMaterialTypeID, [in] long nGraphType, [out] BSTR *xmlResultXML, [out] BSTR *szErrorName) — это из интерфейса IDispatch
Как видно с примера возвращаются два параметра типа стринг.

Делаю такого типа вызов в ASP:
call object.Get(CStr(strSessionID), CLng(strHierarchy), CLng(strLocation), CLng(strProperty), CLng(strMType), CLng(strMode), strXMLData, strErrorName)

и выдает ошибку несоответствия типов для возвращаемых значений strXMLData, strErrorName

если сделать вызов такой:

call object.Get(CStr(strSessionID), CLng(strHierarchy), CLng(strLocation), CLng(strProperty), CLng(strMType), CLng(strMode), CStr(strXMLData), CStr(strErrorName))
то все в порядке (вызов работает), но значения strXMLData, strErrorName равны Empty....

В чем могут быть проблемы?

Говорят что типа неправильно построен сам метод обьекта, а именно не правильно формируются out-параметры, что их нужно якобы предавать по ссылке, типа так:
[id(14), helpstring("method Get")] HRESULT Get([in] BSTR szSession, [in] long nHierarchyID, [in] long nLocationID, [in] long nPropertyValueID, [in] long nMaterialTypeID, [in] long nGraphType, [out, ref] BSTR *xmlResultXML, [out,ref] BSTR *szErrorName), здесь out параметры передаются по ссылке, но это тоже не помогло.

Как быть с конролем типов для out параметра?

Спасибо!!!
Re: Как задать тип для out-параметра?
От: Tom Россия http://www.RSDN.ru
Дата: 11.11.02 10:36
Оценка:
VBScript работает с одним типом данных — VARIANT. По этому если ты передаёшь параметр, то он передаётся как вариант. В твоём случае самое простое это сделать выходной параметр как VARIANT и пихать туда строку.
Народная мудрось
всем все никому ничего(с).
Re[2]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 10:44
Оценка:
Здравствуйте Tom, Вы писали:

Tom>VBScript работает с одним типом данных — VARIANT. По этому если ты передаёшь параметр, то он передаётся как вариант. В твоём случае самое простое это сделать выходной параметр как VARIANT и пихать туда строку.


До сегоднешнего дня так и было, но мне нужен контроль типов, как для входных так и выходных параметров, так как методу который принимает все параметры Variant, то можно запихнуть в качестве параметра все что хочешь, это не совсем правильно с моей точки зрения...
Как сделать правильно?
Re[3]: Как задать тип для out-параметра?
От: Максим Алексейкин Россия  
Дата: 11.11.02 11:00
Оценка:
Здравствуйте Аноним, Вы писали:
[...]

У структуры VARIANT есть поле vt. Вот по его значению и смотри какой тип данных упаковали в вариант.
ICQ #311116826
Re[4]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 11:11
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:

МА>Здравствуйте Аноним, Вы писали:

МА>[...]

МА>У структуры VARIANT есть поле vt. Вот по его значению и смотри какой тип данных упаковали в вариант.


В таком случае весь контроль типов падает на разработчика...
Все работает в Visual Basic, тама контроль типов проверяет сама система, то есть я уверен что если мне нужен в качестве параметра скажем тип Long, то я могу не беспокоится о том что мне передадут String, просто система не даст вызвать метод с неправильно переданными параметрами. Но я имею дело с VBScript, а тама нельзя обьявить переменную типа String, что бы получить результат
Re[5]: Как задать тип для out-параметра?
От: Максим Алексейкин Россия  
Дата: 11.11.02 11:21
Оценка:
Здравствуйте Аноним, Вы писали:
А>В таком случае весь контроль типов падает на разработчика...
А>Все работает в Visual Basic, тама контроль типов проверяет сама система, то есть я уверен что если мне нужен в качестве параметра скажем тип Long, то я могу не беспокоится о том что мне передадут String, просто система не даст вызвать метод с неправильно переданными параметрами. Но я имею дело с VBScript, а тама нельзя обьявить переменную типа String, что бы получить результат

Ok. Тогда перед проверкой типа используй функции типа:
VariantChangeType

Контроль за типами, конечно, ляжет на девелопера. Ну а кому щас легко
При неправильном типе возвращай ошибку, не помню сейчас, какой у нее HRESULT код.
ICQ #311116826
Re[6]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 11:40
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:

МА>Здравствуйте Аноним, Вы писали:

А>>В таком случае весь контроль типов падает на разработчика...
А>>Все работает в Visual Basic, тама контроль типов проверяет сама система, то есть я уверен что если мне нужен в качестве параметра скажем тип Long, то я могу не беспокоится о том что мне передадут String, просто система не даст вызвать метод с неправильно переданными параметрами. Но я имею дело с VBScript, а тама нельзя обьявить переменную типа String, что бы получить результат

МА>Ok. Тогда перед проверкой типа используй функции типа:

МА>
МА>VariantChangeType
МА>

МА>Контроль за типами, конечно, ляжет на девелопера. Ну а кому щас легко
МА>При неправильном типе возвращай ошибку, не помню сейчас, какой у нее HRESULT код.

Для входных параметров все нормально, а вот с выходными траблы именно в VBScript...
Re[7]: Как задать тип для out-параметра?
От: Алекс Россия http://wise-orm.com
Дата: 11.11.02 11:44
Оценка:
Здравствуйте Аноним, Вы писали:

хъ

А>Для входных параметров все нормально, а вот с выходными траблы именно в VBScript...


VarType не подойдет?
Re[7]: Как задать тип для out-параметра?
От: Максим Алексейкин Россия  
Дата: 11.11.02 11:49
Оценка:
Здравствуйте Аноним, Вы писали:
А>Для входных параметров все нормально, а вот с выходными траблы именно в VBScript...

А какие траблы? Я специально с VBScript не работал. Если со значениями, так можно перед возвратом ошибки присвоить что-нить по умолчанию, или я что-то не так понимаю?
ICQ #311116826
Re[8]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 11:51
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте Аноним, Вы писали:


А>хъ


А>>Для входных параметров все нормально, а вот с выходными траблы именно в VBScript...


А>VarType не подойдет?


В смысле, разьясните подробнее... Если можно пример...
Re: Как задать тип для out-параметра?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.11.02 11:52
Оценка:
Здравствуйте Аноним, Вы писали:

А>Есть asp страница, в которой используется VBScript, и вызывется метод COM обьекта:


А>[id(14), helpstring("method Get")] HRESULT Get([in] BSTR szSession, ..., [out] BSTR *xmlResultXML, [out] BSTR *szErrorName) — это из интерфейса IDispatch

А>Как видно с примера возвращаются два параметра типа стринг.
А>...
А>Говорят что типа неправильно построен сам метод обьекта, а именно не правильно формируются out-параметры, что их нужно якобы предавать по ссылке, типа так:

А>[id(14), helpstring("method Get")] HRESULT Get([in] BSTR szSession, ..., [out, ref] BSTR *xmlResultXML, [out,ref] BSTR *szErrorName), здесь out параметры передаются по ссылке, но это тоже не помогло.

Сразу замечу, что ДВА приведенных выше отрывка из IDL идентичны.

А>В чем могут быть проблемы?
А>Как быть с конролем типов для out параметра?

Слушай, раз VBScript нормально понимает [in] BSTR szSession, то попробуй [[b]in,[/b]out] BSTR *xmlResultXML.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 11:53
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:

МА>Здравствуйте Аноним, Вы писали:

А>>Для входных параметров все нормально, а вот с выходными траблы именно в VBScript...

МА>А какие траблы? Я специально с VBScript не работал. Если со значениями, так можно перед возвратом ошибки присвоить что-нить по умолчанию, или я что-то не так понимаю?



Делаю такого типа вызов в ASP из VBScript:
call object.Get(CStr(strSessionID), CLng(strHierarchy), CLng(strLocation), CLng(strProperty), CLng(strMType), CLng(strMode), strXMLData, strErrorName)

и выдает ошибку несоответствия типов для возвращаемых значений strXMLData, strErrorName

если сделать вызов такой:

call object.Get(CStr(strSessionID), CLng(strHierarchy), CLng(strLocation), CLng(strProperty), CLng(strMType), CLng(strMode), CStr(strXMLData), CStr(strErrorName))
то все в порядке (вызов работает), но значения strXMLData, strErrorName равны Empty....
Re[2]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 12:00
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте Аноним, Вы писали:


А>>Есть asp страница, в которой используется VBScript, и вызывется метод COM обьекта:


Vi2>

А>>[id(14), helpstring("method Get")] HRESULT Get([in] BSTR szSession, ..., [out] BSTR *xmlResultXML, [out] BSTR *szErrorName) — это из интерфейса IDispatch

А>>Как видно с примера возвращаются два параметра типа стринг.
А>>...
А>>Говорят что типа неправильно построен сам метод обьекта, а именно не правильно формируются out-параметры, что их нужно якобы предавать по ссылке, типа так:

Vi2>

А>>[id(14), helpstring("method Get")] HRESULT Get([in] BSTR szSession, ..., [out, ref] BSTR *xmlResultXML, [out,ref] BSTR *szErrorName), здесь out параметры передаются по ссылке, но это тоже не помогло.

Vi2>Сразу замечу, что ДВА приведенных выше отрывка из IDL идентичны.

Vi2>

А>>В чем могут быть проблемы?
А>>Как быть с конролем типов для out параметра?

Vi2>Слушай, раз VBScript нормально понимает [in] BSTR szSession, то попробуй [[b]in,[/b]out] BSTR *xmlResultXML.

Это не выход... Зачем мне [in,out] параметры, если он у меня по логике должен быть out, это помоему еще хуже чем использовать в качестве выходного параметра тип Variant. Мне осталось установить чего все нормально работает в Visual Basic, а в VBScript нет!!!
Должно работать!!!
Re[3]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 12:03
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Vi2, Вы писали:


Vi2>>Здравствуйте Аноним, Вы писали:


А>>>Есть asp страница, в которой используется VBScript, и вызывется метод COM обьекта:


Vi2>>

А>>>[id(14), helpstring("method Get")] HRESULT Get([in] BSTR szSession, ..., [out] BSTR *xmlResultXML, [out] BSTR *szErrorName) — это из интерфейса IDispatch

А>>>Как видно с примера возвращаются два параметра типа стринг.
А>>>...
А>>>Говорят что типа неправильно построен сам метод обьекта, а именно не правильно формируются out-параметры, что их нужно якобы предавать по ссылке, типа так:

Vi2>>

А>>>[id(14), helpstring("method Get")] HRESULT Get([in] BSTR szSession, ..., [out, ref] BSTR *xmlResultXML, [out,ref] BSTR *szErrorName), здесь out параметры передаются по ссылке, но это тоже не помогло.

Vi2>>Сразу замечу, что ДВА приведенных выше отрывка из IDL идентичны.

Vi2>>

А>>>В чем могут быть проблемы?
А>>>Как быть с конролем типов для out параметра?

Vi2>>Слушай, раз VBScript нормально понимает [in] BSTR szSession, то попробуй [[b]in,[/b]out] BSTR *xmlResultXML.

А>Это не выход... Зачем мне [in,out] параметры, если он у меня по логике должен быть out, это помоему еще хуже чем использовать в качестве выходного параметра тип Variant. Мне осталось установить чего все нормально работает в Visual Basic, а в VBScript нет!!!

А>Должно работать!!!


Vi2>>Сразу замечу, что ДВА приведенных выше отрывка из IDL идентичны.

Несогласен!!!
Первое возвращается по указателю, а второе по ссылке и значение не может менятся вызывающей функцией!!!
Re[3]: Как задать тип для out-параметра?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.11.02 12:09
Оценка:
Здравствуйте Аноним, Вы писали:

А>Это не выход... Зачем мне [in,out] параметры, если он у меня по логике должен быть out, это помоему еще хуже чем использовать в качестве выходного параметра тип Variant. Мне осталось установить чего все нормально работает в Visual Basic, а в VBScript нет!!!
А>Должно работать!!!

Давай по порядку.
1. В VBScript нет типизированных переменных (в VB есть).
2. Вызов функции (или метода) идет через Invoke. Поэтому до лампочки, что ты там напишешь в IDL — in или out, long или BSTR. VBScript будет передавать VARIANT*.
3. При вызове call object.Get(CStr(strSessionID), ..., strXMLData, strErrorName) скорее всего передается VARIANT от CStr с VT_BSTR, поэтому обработчик Invoke может распаковать в BSTR. Раз strSessionID — это строка, то передай как есть call object.Get(strSessionID, ..., strXMLData, strErrorName), получишь Ощибку преобразования на первом параметре (для уверенности, сделай один параметр in).
4. Параметр out нет никакого смысла контролировать, так как, чтобы там не содержалось, это будет переписано на строку. Этим ты и гарантируешь возврат строки.

Поэтому делай [out]VARIANT* xmlResultXML, в нем точно будет строка, если ты туда запишешь строку.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: [out] и [out, ref]
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.11.02 12:14
Оценка:
Здравствуйте Аноним, Вы писали:

А>Несогласен!!!
А>Первое возвращается по указателю, а второе по ссылке и значение не может менятся вызывающей функцией!!!

Это не имеет значения. [out] BSTR *xmlResultXML эквивалентно [out, ref] BSTR *xmlResultXML.
Потому что если не указан модификатор ptr|ref|unique перед топ-указателем, то считается, что указано ref.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 12:25
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте Аноним, Вы писали:


Vi2>

А>>Это не выход... Зачем мне [in,out] параметры, если он у меня по логике должен быть out, это помоему еще хуже чем использовать в качестве выходного параметра тип Variant. Мне осталось установить чего все нормально работает в Visual Basic, а в VBScript нет!!!
А>>Должно работать!!!

Vi2>Давай по порядку.
Vi2>1. В VBScript нет типизированных переменных (в VB есть).

Согласен!!!

Vi2>2. Вызов функции (или метода) идет через Invoke. Поэтому до лампочки, что ты там напишешь в IDL — in или out,


Несогласен!!! Нужно знать тому же Invoke что является входным параметром, а что выходным...

long или BSTR. VBScript будет передавать VARIANT*.

Действительно идет преобразование, так как Invoke принимает параметры типа Variant, но все эти преобразования делаются независимо от разработчика...


Vi2>3. При вызове call object.Get(CStr(strSessionID), ..., strXMLData, strErrorName) скорее всего передается VARIANT от CStr с VT_BSTR, поэтому обработчик Invoke может распаковать в BSTR. Раз strSessionID — это строка, то передай как есть call object.Get(strSessionID, ..., strXMLData, strErrorName), получишь Ощибку преобразования на первом параметре (для уверенности, сделай один параметр in).


strXMLData, strErrorName у меня должны быть строками, а VBScript передает Variant, поэтому несоответсвие типов, если бы можна было бы указть что это строки, то и проблем бы не было...

Vi2>4. Параметр out нет никакого смысла контролировать, так как, чтобы там не содержалось, это будет переписано на строку. Этим ты и гарантируешь возврат строки.


Возможно, но это нужно знать тому кто эти обьекты юзает, так как он без понятия что кроется за типом Variant....

Vi2>Поэтому делай [out]VARIANT* xmlResultXML, в нем точно будет строка, если ты туда запишешь строку.


Сейчас у меня так и есть, но тогда как я все это делал мне казалось что я делаю неправильно и обязательно переделаю как надо, но не там то было....

Это мне не нравится, потому что в Visual Basic можно все по нормальному сделать, а в скрипте нет!!!

Должен же быть какой то выход, не может же быть все так тупо...

Нахрена тогда вообще эта вся возня с типами, все бы сделали через Variant и все!!!!
Re[5]: [out] и [out, ref]
От: Аноним  
Дата: 11.11.02 12:27
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте Аноним, Вы писали:


Vi2>

А>>Несогласен!!!
А>>Первое возвращается по указателю, а второе по ссылке и значение не может менятся вызывающей функцией!!!

Vi2>Это не имеет значения. [out] BSTR *xmlResultXML эквивалентно [out, ref] BSTR *xmlResultXML.
Vi2>Потому что если не указан модификатор ptr|ref|unique перед топ-указателем, то считается, что указано ref.

Хорошо, тогда скажи мне как записать разницу: возврат параметра по указателю, по значению и по ссылке?
Re[5]: [out] и [out, ref]
От: Алекс Россия http://wise-orm.com
Дата: 11.11.02 12:40
Оценка:
Здравствуйте Vi2, Вы писали:

хъ

Vi2>Потому что если не указан модификатор ptr|ref|unique перед топ-указателем, то считается, что указано ref.


Не будем забывать про pointer_default.
Re[6]: [out] и [out, ref]
От: Аноним  
Дата: 11.11.02 12:42
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте Vi2, Вы писали:


А>хъ


Vi2>>Потому что если не указан модификатор ptr|ref|unique перед топ-указателем, то считается, что указано ref.


А>Не будем забывать про pointer_default.


Это уже подробности, но вы так и не ответили на мой вопрос...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.