Re[7]: [out] и [out, ref]
От: Алекс Россия http://wise-orm.com
Дата: 11.11.02 12:46
Оценка:
Здравствуйте Аноним, Вы писали:

[]

А>Это уже подробности, но вы так и не ответили на мой вопрос...


Про VarType-то. Вот пример из MSDN.
Dim MyCheck
MyCheck = VarType(300)          ' Returns 2.
MyCheck = VarType(#10/19/62#)   ' Returns 7.
MyCheck = VarType("VBScript")   ' Returns 8.


Ищи на [R|M]SDN!
Re[6]: [out] и [out, ref]
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.11.02 12:49
Оценка:
Здравствуйте Аноним, Вы писали:

А>Хорошо, тогда скажи мне как записать разницу: возврат параметра по указателю, по значению и по ссылке?

Никак. А ты сам-то чувствуешь разницу?
"Возврат параметра ... по значению" просто невозможен.
А для других — "возврат параметра ... по ссылке", например, для С — бессмыслица, поскольку ссылок нет. Для С++ — это почти одно и то же (по параметрам стека и т.п.).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: [out] и [out, ref]
От: Lexey Россия  
Дата: 11.11.02 12:57
Оценка:
Здравствуйте Аноним, Вы писали:

А>Хорошо, тогда скажи мне как записать разницу: возврат параметра по указателю, по значению и по ссылке?


По значению:
Type* pVal
По указателю или по сслыке:
Type** ppVal

idl'ные модификаторы влияют только на маршалинг, но не на тип адресации.
Re[5]: Как задать тип для out-параметра?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.11.02 13:18
Оценка:
Здравствуйте Аноним, Вы писали:

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

Invoke имеет [in, out] DISPPARAMS * pDispParams, где находятся все твои параметры.

Поэтому, если ты хочешь, чтобы хорошо жилось клиентам на VB-е или VBScript-e (тем паче JScript-е), тебе нужно реализовывать свой обработчик IDispatch::Invoke, где ты бы мог преобразовать все параметры так, как тебе нужно. Но это, я скажу, не подарок.

Из VARIANT* с неизвестно каким типом внутри на свои long и BSTR. И обратно, из своих long и BSTR в VARIANT для возврата. Где-то была статья (VARIANT и SafeArray (и там Передача данных по ссылке (VT_BYREF))
Автор(ы):
Дата: 13.10.2002
)

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

Ты еще не пробовал с JScript-ом работать и т.п. экзотикой! Сходство названия VB и VBS и их языковых конструкций — не повод, чтобы они были совсем уж одинаковыми.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Как задать тип для out-параметра?
От: Максим Алексейкин Россия  
Дата: 11.11.02 13:41
Оценка:
Здравствуйте Аноним, Вы писали:

А>>>Это не выход... Зачем мне [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++,
но есть что-то, которое мы не знаем...

Вот так вот!!!
Re[7]: Как задать тип для out-параметра?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.11.02 14:19
Оценка:
Здравствуйте Аноним, Вы писали:

А>Придется все оставить, как было... Истина, где-то там!!!
А>P.S. Тестил я тут один COM обьект написанный на Visual Basic, все работает и в Visual Basic и у VBScript, тама метод обьекта был обьявлен так:
А>Sub Method( ByRef outVal as string);

Для VBScript-а до лампочки, как этот метод описан — ByRef или ByVal. string или long или Variant. Это прерогатива сервера — обработать параметры как надо. А способ мы тебе указали: реализуй свою обработку Invoke.

VB — умный и для себя многие параметры преобразует в Invoke не так, как это делает VC.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 14:31
Оценка:
Здравствуйте Аноним, Вы писали:

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


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


А>>>>>Это не выход... Зачем мне [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 набокопорило с этим, наверно на это были очень везкие причины...
Re[8]: Как задать тип для out-параметра?
От: Максим Алексейкин Россия  
Дата: 11.11.02 14:39
Оценка:
Здравствуйте Аноним, Вы писали:
А>... наверно на это были очень везкие причины...

Ага, забили они на бэйсик просто. Все под флаги .NET
ICQ #311116826
Re[9]: Как задать тип для out-параметра?
От: Аноним  
Дата: 11.11.02 14:45
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:

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

А>>... наверно на это были очень везкие причины...

МА>Ага, забили они на бэйсик просто. Все под флаги .NET


Не знаю, как тама под .NET, но думаю, если они эти проблемы не порешали раньше, то врядли их спасет .NET, так как все эти проблемы переползают из версии в версию...
Re[10]: Примерно так...
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.11.02 16:10
Оценка:
Здравствуйте Аноним, Вы писали:

А>Не знаю, как тама под .NET, но думаю, если они эти проблемы не порешали раньше, то врядли их спасет .NET, так как все эти проблемы переползают из версии в версию...

Попробуй такую обработку вставить:
class ATL_NO_VTABLE Cx : 
...
{
...
    STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
        LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
        EXCEPINFO* pexcepinfo, UINT* puArgErr)
    {
        DISPPARAMS mypdispparams;
        mypdispparams.cArgs = pdispparams->cArgs;
        mypdispparams.rgvarg = new VARIANT[pdispparams->cArgs];
        for( unsigned int i = 0; i < pdispparams->cArgs; i++ )
        {
            if( (pdispparams->rgvarg[i].vt & VT_VARIANT) == VT_VARIANT )
            {
                mypdispparams.rgvarg[i].vt = pdispparams->rgvarg[i].pvarVal->vt | VT_BYREF;
                mypdispparams.rgvarg[i].byref = &(pdispparams->rgvarg[i].pvarVal->byref);
            }
            else
                mypdispparams.rgvarg[i] = pdispparams->rgvarg[i];
        }
        mypdispparams.cNamedArgs = 0;
        mypdispparams.rgdispidNamedArgs = NULL;

        HRESULT hr = IDispatchImpl<Ix, &IID_Ix, &LIBID_RECLib>::Invoke(dispidMember, riid, lcid,
        wFlags, &mypdispparams, pvarResult, pexcepinfo, puArgErr);

        delete [] mypdispparams.rgvarg;
        return hr;
    }

Вот вызовы метода HRESULT callingthismethod([in] BSTR szSession, [out] BSTR *xmlResultXML);
В VBScript:
        Dim Message, Message2
или так        Call Time.callingthismethod(CStr(Message),Message2)
или так        Call Time.callingthismethod(Message,Message2)

В VB:
или так        Dim o As RECLib.Cx
или так        Dim o As Object
        o.callingthismethod s1, s2
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: Как задать тип для out-параметра?
От: Balu  
Дата: 29.01.03 15:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>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


Такой вот вызов:
        _CalcForecastPtr pCalcForecast;
        try
        {
            hr = pCalcForecast.CreateInstance(CLSID_CalcForecast);
            if (FAILED(hr))
            {
                errName = "8Couldn't create COM object";
                return S_OK;
            }
        }
        catch(...)
        {
            errName = "8Couldn't create GetForecast::calcForecast()";
            return S_OK;
        }
        BSTR outputXML;
        try
        {
                        _bstr_t inputXML = "blablabla";
            hr = pCalcForecast->CalcForecast(inputXML, &outputXML);
            SysFreeString(outputXML);
        }
        catch(...)
        {
            SysFreeString(outputXML);
            errName = "8Couldn't execute GetForecast::calcForecast()";
            return S_OK;
        }


При этом вызов вообще не происходит! Валится, даже try...catch не ловит!

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