Привет всем!!!
Вообщем вопрос в следующем:
Есть 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 параметры передаются по ссылке, но это тоже не помогло.
VBScript работает с одним типом данных — VARIANT. По этому если ты передаёшь параметр, то он передаётся как вариант. В твоём случае самое простое это сделать выходной параметр как VARIANT и пихать туда строку.
Народная мудрось
всем все никому ничего(с).
Re[2]: Как задать тип для out-параметра?
От:
Аноним
Дата:
11.11.02 10:44
Оценка:
Здравствуйте Tom, Вы писали:
Tom>VBScript работает с одним типом данных — VARIANT. По этому если ты передаёшь параметр, то он передаётся как вариант. В твоём случае самое простое это сделать выходной параметр как VARIANT и пихать туда строку.
До сегоднешнего дня так и было, но мне нужен контроль типов, как для входных так и выходных параметров, так как методу который принимает все параметры Variant, то можно запихнуть в качестве параметра все что хочешь, это не совсем правильно с моей точки зрения...
Как сделать правильно?
У структуры VARIANT есть поле vt. Вот по его значению и смотри какой тип данных упаковали в вариант.
ICQ #311116826
Re[4]: Как задать тип для out-параметра?
От:
Аноним
Дата:
11.11.02 11:11
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:
МА>Здравствуйте Аноним, Вы писали: МА>[...]
МА>У структуры VARIANT есть поле vt. Вот по его значению и смотри какой тип данных упаковали в вариант.
В таком случае весь контроль типов падает на разработчика...
Все работает в Visual Basic, тама контроль типов проверяет сама система, то есть я уверен что если мне нужен в качестве параметра скажем тип Long, то я могу не беспокоится о том что мне передадут String, просто система не даст вызвать метод с неправильно переданными параметрами. Но я имею дело с VBScript, а тама нельзя обьявить переменную типа String, что бы получить результат
Здравствуйте Аноним, Вы писали: А>В таком случае весь контроль типов падает на разработчика... А>Все работает в 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...
Здравствуйте Аноним, Вы писали: А>Для входных параметров все нормально, а вот с выходными траблы именно в VBScript...
А какие траблы? Я специально с VBScript не работал. Если со значениями, так можно перед возвратом ошибки присвоить что-нить по умолчанию, или я что-то не так понимаю?
ICQ #311116826
Re[8]: Как задать тип для out-параметра?
От:
Аноним
Дата:
11.11.02 11:51
Оценка:
Здравствуйте Алекс, Вы писали:
А>Здравствуйте Аноним, Вы писали:
А>хъ
А>>Для входных параметров все нормально, а вот с выходными траблы именно в VBScript...
А>VarType не подойдет?
В смысле, разьясните подробнее... Если можно пример...
Здравствуйте Аноним, Вы писали:
А>Есть 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.
Здравствуйте Максим Алексейкин, Вы писали:
МА>Здравствуйте Аноним, Вы писали: А>>Для входных параметров все нормально, а вот с выходными траблы именно в 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 идентичны.
Несогласен!!!
Первое возвращается по указателю, а второе по ссылке и значение не может менятся вызывающей функцией!!!
А>Это не выход... Зачем мне [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, в нем точно будет строка, если ты туда запишешь строку.
А>Несогласен!!!
А>Первое возвращается по указателю, а второе по ссылке и значение не может менятся вызывающей функцией!!!
Это не имеет значения. [out] BSTR *xmlResultXML эквивалентно [out, ref] BSTR *xmlResultXML.
Потому что если не указан модификатор ptr|ref|unique перед топ-указателем, то считается, что указано ref.
Здравствуйте 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.
Хорошо, тогда скажи мне как записать разницу: возврат параметра по указателю, по значению и по ссылке?
хъ
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.
Это уже подробности, но вы так и не ответили на мой вопрос...
А>Хорошо, тогда скажи мне как записать разницу: возврат параметра по указателю, по значению и по ссылке?
Никак. А ты сам-то чувствуешь разницу?
"Возврат параметра ... по значению" просто невозможен.
А для других — "возврат параметра ... по ссылке", например, для С — бессмыслица, поскольку ссылок нет. Для С++ — это почти одно и то же (по параметрам стека и т.п.).
А>Несогласен!!! Нужно знать тому же 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