AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.03.2010, 01:48   #1  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
"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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Можно воспользоваться парой WINAPI-функций UrlEscape и UrlUnescape
__________________
Axapta v.3.0 sp5 kr2
Старый 26.03.2010, 17:40   #3  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от AndyD Посмотреть сообщение
Можно воспользоваться парой WINAPI-функций UrlEscape и UrlUnescape

Спасибо за совет. По сути эти функции делают то же самое: меняют спец. символы (&) на их escape-последовательности (%26).

Почему при передаче эти escape-последовательности автоматически не преобразуются обратно, пока так не и не разобрался. Стандартная ведь операция должна быть.
Старый 26.03.2010, 18:15   #4  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Специально проверил в 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  
zelibobis is offline
zelibobis
Участник
 
71 / 24 (1) +++
Регистрация: 15.10.2007
Адрес: Kiev
нашли решение?
Старый 22.06.2010, 17:09   #6  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от zelibobis Посмотреть сообщение
нашли решение?

Нет. Решил, что решения данной конкретной проблемы не существует.
Я использовал подходящий для моей задачи workaround: открывал требуемую веб-страницу и силком засовывал необходимый текст в соответстующий веб-контрол.
Старый 20.09.2010, 12:13   #7  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Подкинули задачку, как выяснилось, она решаема. Написано это все для 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);
На выходе получим то, что нужно - массив двоичных однобайтовых данных, упакованный в SafeArray.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...

Последний раз редактировалось Maximin; 20.09.2010 в 13:07.
За это сообщение автора поблагодарили: Hyper (1).
Теги
activex, com-объект, internet explorer

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Microsoft Dynamics AX 2009 White Paper: Integrating a Third Party Version Control System into Microsoft Dynamics AX 2009 Vadik DAX: База знаний и проекты 0 05.02.2010 10:27
Microsoft Dynamics AX 2009 White Paper: Using the Version Control Integration with Microsoft Team Foundation Server Vadik DAX: База знаний и проекты 0 09.07.2009 13:17
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
axStart: Microsoft Dynamics AX 2009 White Paper: Team Foundation Server Version Control Setup Blog bot DAX Blogs 0 27.07.2008 13:06
Consuming "CustomerService" Web Service Blog bot DAX Blogs 0 25.01.2008 15:10
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:32.