А>Хорошо, тогда скажи мне как записать разницу: возврат параметра по указателю, по значению и по ссылке?
Никак. А ты сам-то чувствуешь разницу?
"Возврат параметра ... по значению" просто невозможен.
А для других — "возврат параметра ... по ссылке", например, для С — бессмыслица, поскольку ссылок нет. Для С++ — это почти одно и то же (по параметрам стека и т.п.).
А>Несогласен!!! Нужно знать тому же Invoke что является входным параметром, а что выходным...
Invoke имеет [in, out] DISPPARAMS * pDispParams, где находятся все твои параметры.
Поэтому, если ты хочешь, чтобы хорошо жилось клиентам на VB-е или VBScript-e (тем паче JScript-е), тебе нужно реализовывать свой обработчик IDispatch::Invoke, где ты бы мог преобразовать все параметры так, как тебе нужно. Но это, я скажу, не подарок.
А>Это мне не нравится, потому что в Visual Basic можно все по нормальному сделать, а в скрипте нет!!!
А>Должен же быть какой то выход, не может же быть все так тупо...
А>Нахрена тогда вообще эта вся возня с типами, все бы сделали через Variant и все!!!!
Ты еще не пробовал с JScript-ом работать и т.п. экзотикой! Сходство названия VB и VBS и их языковых конструкций — не повод, чтобы они были совсем уж одинаковыми.
Здравствуйте Аноним, Вы писали:
А>>>Это не выход... Зачем мне [in,out] параметры, если он у меня по логике должен быть out, это помоему еще
Всё конечно должно быть [out], с этим у тебя всё верно.
А> VBScript будет передавать VARIANT*.
Вот именно VARIANT. Даже в VB требуется жесткое совпадение типов для параметров ByRef. Нельзя передать для ByRef String переменную типа Variant. Всё дальнейшее обсуждение не имеет смысла. Причина ясна и надо лишь решить как это обойти. Боюсь без изменения типов параметров (только ByRef) не обойтись.
А>Это мне не нравится, потому что в Visual Basic можно все по нормальному сделать, а в скрипте нет!!!
В VB подобное могло срабатывать из за не явного приведения типов, VBScript естественно так не умеет.
А>Должен же быть какой то выход, не может же быть все так тупо...
А>Нахрена тогда вообще эта вся возня с типами, все бы сделали через Variant и все!!!!
Так и придется делать.
Удачи.
ICQ #311116826
Re[6]: Как задать тип для out-параметра?
От:
Аноним
Дата:
11.11.02 14:08
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:
МА>Здравствуйте Аноним, Вы писали:
А>>>>Это не выход... Зачем мне [in,out] параметры, если он у меня по логике должен быть out, это помоему еще
МА>Всё конечно должно быть [out], с этим у тебя всё верно.
А>> VBScript будет передавать VARIANT*.
МА>Вот именно VARIANT. Даже в VB требуется жесткое совпадение типов для параметров ByRef. Нельзя передать для ByRef String переменную типа Variant. Всё дальнейшее обсуждение не имеет смысла. Причина ясна и надо лишь решить как это обойти. Боюсь без изменения типов параметров (только ByRef) не обойтись.
А>>Это мне не нравится, потому что в Visual Basic можно все по нормальному сделать, а в скрипте нет!!!
МА>В VB подобное могло срабатывать из за не явного приведения типов, VBScript естественно так не умеет.
А>>Должен же быть какой то выход, не может же быть все так тупо...
МА>
А>>Нахрена тогда вообще эта вся возня с типами, все бы сделали через Variant и все!!!!
МА>Так и придется делать. МА>Удачи.
Придется все оставить, как было... Истина, где-то там!!!
P.S. Тестил я тут один COM обьект написанный на Visual Basic, все работает и в Visual Basic и у VBScript, тама метод обьекта был обьявлен так:
Sub Method( ByRef outVal as string);
И все работает!!!
Но мои COM+ обьекты написаны на Visual C++, на базе ATL, и ясно что уже никто ничего переделывать не будет, тем более тама support-ы MTS, pooling objects, которые неизвестно как делаются на Visual Basic, да и в принципе все можно все сделать по уму и на Visual C++,
но есть что-то, которое мы не знаем...
А>Придется все оставить, как было... Истина, где-то там!!!
А>P.S. Тестил я тут один COM обьект написанный на Visual Basic, все работает и в Visual Basic и у VBScript, тама метод обьекта был обьявлен так:
А>Sub Method( ByRef outVal as string);
Для VBScript-а до лампочки, как этот метод описан — ByRef или ByVal. string или long или Variant. Это прерогатива сервера — обработать параметры как надо. А способ мы тебе указали: реализуй свою обработку Invoke.
VB — умный и для себя многие параметры преобразует в Invoke не так, как это делает VC.
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Максим Алексейкин, Вы писали:
МА>>Здравствуйте Аноним, Вы писали:
А>>>>>Это не выход... Зачем мне [in,out] параметры, если он у меня по логике должен быть out, это помоему еще
МА>>Всё конечно должно быть [out], с этим у тебя всё верно.
А>>> VBScript будет передавать VARIANT*.
МА>>Вот именно VARIANT. Даже в VB требуется жесткое совпадение типов для параметров ByRef. Нельзя передать для ByRef String переменную типа Variant. Всё дальнейшее обсуждение не имеет смысла. Причина ясна и надо лишь решить как это обойти. Боюсь без изменения типов параметров (только ByRef) не обойтись.
А>>>Это мне не нравится, потому что в Visual Basic можно все по нормальному сделать, а в скрипте нет!!!
МА>>В VB подобное могло срабатывать из за не явного приведения типов, VBScript естественно так не умеет.
А>>>Должен же быть какой то выход, не может же быть все так тупо...
МА>>
А>>>Нахрена тогда вообще эта вся возня с типами, все бы сделали через Variant и все!!!!
МА>>Так и придется делать. МА>>Удачи.
А> А>Придется все оставить, как было... Истина, где-то там!!!
А>P.S. Тестил я тут один COM обьект написанный на Visual Basic, все работает и в Visual Basic и у VBScript, тама метод обьекта был обьявлен так:
А>Sub Method( ByRef outVal as string);
А>И все работает!!! А>Но мои COM+ обьекты написаны на Visual C++, на базе ATL, и ясно что уже никто ничего переделывать не будет, тем более тама support-ы MTS, pooling objects, которые неизвестно как делаются на Visual Basic, да и в принципе все можно все сделать по уму и на Visual C++, А> но есть что-то, которое мы не знаем...
А>Вот так вот!!!
ПРИГОВОР: Сделал я import type library (для обьекта написанного на VB ) в среде C++Builder и тама output parameter был указан как Variant, то есть обман это все... Для in-parametrov можна указывать тип и то этот тип должен быть типом автоматизации, если обьект поддержывает дуальный интерфейс, а на out-параметры, все отдыхают...
Да, что-то Microsoft набокопорило с этим, наверно на это были очень везкие причины...
Здравствуйте Аноним, Вы писали: А>... наверно на это были очень везкие причины...
Ага, забили они на бэйсик просто. Все под флаги .NET
ICQ #311116826
Re[9]: Как задать тип для out-параметра?
От:
Аноним
Дата:
11.11.02 14:45
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:
МА>Здравствуйте Аноним, Вы писали: А>>... наверно на это были очень везкие причины...
МА>Ага, забили они на бэйсик просто. Все под флаги .NET
Не знаю, как тама под .NET, но думаю, если они эти проблемы не порешали раньше, то врядли их спасет .NET, так как все эти проблемы переползают из версии в версию...
А>Не знаю, как тама под .NET, но думаю, если они эти проблемы не порешали раньше, то врядли их спасет .NET, так как все эти проблемы переползают из версии в версию...
Здравствуйте, Аноним, Вы писали:
А>P.S. Тестил я тут один COM обьект написанный на Visual Basic, все работает и в Visual Basic и у VBScript, тама метод обьекта был обьявлен так:
А>Sub Method( ByRef outVal as string);
А>И все работает!!!
А у меня так же объявлен метод, но он не работает! Правда вызываю я его из Visual C++ при помощи ATL:
Public Sub calcForecast(ByVal inputXML As String, ByRef outputXML As String)
...
End Sub