26.03.2010, 01:48 | #1 |
Участник
|
"Microsoft Web Browser" ActiveX control, проблема с передачей данных
Использую ActiveX контрол "Microsoft Web Browser" следующим образом:
X++: COMVariant flags; COMVariant targetFrameName; COMVariant postData; COMVariant headers; str headersStr = 'Content-Type: application/x-www-form-urlencoded\r\n'; ; flags = COMVariant::createFromInt64(0); targetFrameName = COMVariant::createFromStr(''); postData = COMVariant::createFromArray(element.str2array(text)); headers = COMVariant::createFromStr(headersStr); WebBrowser.Navigate(url, flags, targetFrameName, postData, headers); Не могу понять, как правильно закодировать переменную text для postData. Если text == "+1&2+3&4", то плюсы и амперсанды при передаче исчезают: "1,2 3,4". Интернет подсказал, что надо менять плюс на %2B, а амперсанд на %26, но почему-то у меня при передаче они не преобразуются обратно в плюсы и амерсанды, а так и приходят: "%2B1%262%2B3%264" Вот код используемой функции str2array() X++: Array str2array(str _data) { Array arr; int i; ; //_data = strreplace(_data, num2char(160), ' '); //_data = strreplace(_data, '%', '%25'); _data = strreplace(_data, '&', '%26'); _data = strreplace(_data, '+', '%2B'); arr = new Array(Types::Enum); for (i = 1; i <= strlen(_data); i++) arr.value(i, char2num(_data, i)); return arr; } Что я делаю не так, как правильно передавать спец. символы? |
|
26.03.2010, 09:13 | #2 |
Участник
|
Можно воспользоваться парой WINAPI-функций UrlEscape и UrlUnescape
__________________
Axapta v.3.0 sp5 kr2 |
|
26.03.2010, 17:40 | #3 |
Участник
|
Цитата:
Сообщение от AndyD
Можно воспользоваться парой WINAPI-функций UrlEscape и UrlUnescape
Спасибо за совет. По сути эти функции делают то же самое: меняют спец. символы (&) на их escape-последовательности (%26). Почему при передаче эти escape-последовательности автоматически не преобразуются обратно, пока так не и не разобрался. Стандартная ведь операция должна быть. |
|
26.03.2010, 18:15 | #4 |
Участник
|
Специально проверил в C#:
Код: string PostDataStr = "%26"; byte[] PostDataByte = Encoding.UTF8.GetBytes(PostDataStr); string AdditionalHeaders = "Content-Type: application/x-www-form-urlencoded" + Environment.NewLine; webBrowser1.Navigate(WebAddress, "", PostDataByte, AdditionalHeaders); Сайт, как и положено, получает символ амперсанда. Из Аксапты я этого добиться не могу: как передается "%26", так сайт "%26" и получает. И наверняка ведь какая-то пустяковая ошибка то ли при формировании массива, то ли еще в чем-то. |
|
22.06.2010, 12:55 | #5 |
Участник
|
нашли решение?
|
|
22.06.2010, 17:09 | #6 |
Участник
|
|
|
20.09.2010, 12:13 | #7 |
NavAx
|
Подкинули задачку, как выяснилось, она решаема. Написано это все для 3ки, для 4ки и 2009 есть смысл использовать класс BinData - там все проще.
Так вот. Неважно, в каком виде мы помещаем в массив значения, то ли Types::Enum, то ли Types::Integer. Главное - как мы потом запихнем это в правильно инициализированный Variant. CreateFromArray - не подходит, т.к. проблема на самом деле в том, что createFromArray всегда формирует SafeArray из VT_I4(если мы передаем числовые типы, если строки - то будет VT_BSTR), в результате чего, сервер получает значения "расширенные" 3мя нулями и у него сносит крышу (пропадают спецсимволы и вообще, творится армагеддон ). Надо брать метод safeArray, позволяющий указать тип получаемого SaleArray (а нам нужен, по сути, массив байт). Так и пишем: X++: str string = "+1&2+3&4"; COMVariant cv; Array ar = new Array(Types::Enum); //или Types::Integer int i; for (i=1;i<strlen(string);i++) { ar.value(i, char2num(string, i)); } cv = new ComVariant(COMVariantInOut::Out, COMVariantType::VT_SAFEARRAY); cv.safeArray(ar, COMVariantType::VT_I1);
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... Последний раз редактировалось Maximin; 20.09.2010 в 13:07. |
|
|
За это сообщение автора поблагодарили: Hyper (1). |
Теги |
activex, com-объект, internet explorer |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|