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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.02.2024, 17:56   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
? Ax2012 ActiveX WebBrowser - странное поведение
Всем привет.

Хотелось обсудить странное поведение компонента Web browser. Мы используем этот ActiveX на форме. Отображаем при его помощи простую страничку (немного текста и картинок). Страничка сделана под Edge.
Выяснилась интересная особенность. (все описание сделано для Ax2012- R3 но проблема актуальная и для 2009-й)

Если для ActiveX контрола вызвать метод Navigate указав путь к файлу html то все отображается корректно, так как в Edge (как задумал наш верстальщик)
Но если подготовленный html не сохранять в файл, а в виде строковой переменной htmlText скормить сразу ActiveX контролу (MyActiveXcontrol) вызовом
X++:
SysHelp::showHelp(MyActiveXcontrol, htmlText);
(а так в стандартной аксапте во многих местах и делается, например - форма сравнения узлов AOT, форма контрольного списка установки обновления и.т.п.),
то (Внимание!) ни фига мы не получим отображения как в Edge. Вокруг картинок будут черные рамочки (см файлы со скриншотами AsIE8_IE10_ShapeIsCorrupted.png и AsEdge_ShapeIsOk.png)
Немного помедитировав над полученным отображением, я догадался что оно соответствует какому-то из режимов отображения (IE8, IE9, IE10). При отображении в последней версии IE можно настройкой совместимости по F12 также добиться черных рамочек..

Как-то непоследовательно себя ведет ActiveX Web browser

Стали копать. Хочется, чтобы одинаково было.
Выяснилось, что при вызове SysHelp::showHelp() аксапта сперва требует от контрола отобразить пустую страничку из ресурса res://mshtml.dll/blank.htm (см. метод SysHelp::initWebBrowser) затем получает Com объект Document (SysHelp::insertHTML2Document) и пишет в него текст html из переменной. И в этот момент ActiveX отрисовывает страничку.
Но почему-то в режиме совместимости с предыдущей версией IE.
технология такая же как описано тут
https://habr.com/ru/articles/163841/
http://www.msvb.narod.ru/doc_webbrowser_p1.htm
http://www.msvb.narod.ru/doc_webbrowser_p2.htm
)

Одна из догадок в том, что шаблон пустой страницы res://mshtml.dll/blank.htm уже подразумевает режим совместимости, так что мы его не можем перекрыть в тексте нашего html.
О чем-то подобном описано тут
https://mpbox.ru/manuals/html/meta-t...ua-compatible/
Цитата:
PHP код:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 
Тег должен находиться в секции head страницы перед всеми остальными элементами, за исключением title и других мета-элементов. В противном случае он игнорируется!
Вроде бы мы нашли причину?
Пробуем исправить.
Делаем свой файлик пустышку, который используем для инициализации контрола вместо res://mshtml.dll/blank.htm, прописывая в его заголовке нужный нам режим совместимости
PHP код:
<meta http-equiv="X-UA-Compatible" content="ie=edge"
, чтобы затем уже подсунуть ему в SysHelp::insertHTML2Document нужный нам сгенерированный html
И!

Фокус не удался.
Пробовали разные варианты

Так
PHP код:
<!doctype html>
<
html lang="en">
<
head>
<
meta charset="UTF-16LE">
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
<
meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</
head>
<
body></body>
</
html
так
PHP код:
<html>
<
head>
<
meta http-equiv="X-UA-Compatible" content="ie=edge" />
</
head>
<
body></body>
</
html
так
PHP код:
<HTML>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
</
HTML
и так
PHP код:
<HTML>
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
</
HTML
и эдак
PHP код:
<!doctype html>
<
HTML>
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
</
HTML
и вот так
PHP код:
<!doctype html>
<
HTML>
<
head>
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
</
head>
</
HTML
и никак не работает.
Даже взяли, сделали сперва Navigate на наш рабочий файлик с html, а затем его же содержимое скормили контролу через SysHelp::showHelp
И так тоже не сработало !

Более того, в тех случаях, когда явно в файле инициализации стоял режим совместимости Edge - вообще ломалось исполнение метода SysHelp::insertHTML2Document !!!

Вызов
X++:
activeX.document();
в методе SysHelp::initWebBrowser
стал возвращать объект другого типа !
Если в нормальном случае это Com для которого ToString() дает значение DispHTMLDocument
То теперь это Com, для которого ToString() дает значение JScriptTypeInfo
а затем при попытке исполнить код
X++:
document.open('');
в методе SysHelp::insertHTML2Document
все валится с ошибкой :
Цитата:
"Число аргументов, указанных в вызове функции, отличается от числа аргументов в объявлении метода."
т.е. явно почему-то пришел объект другого типа.

Похоже у Edge движка какая-то другая объектная модель или другой интерфейс используется. И если уж страничка отобразилась в режиме совместимости Edge вызовом Navigate метода (т.е. в браузере подцепился движок от Edge, а не от IE какой-то из предыдущих версий), то для нее перестает работать получение document() и аксаптовский способ работы с Web browser ломается.


В общем, очень странно.

Может кто-нибудь знает как это побороть ?
Есть альтернативы ?
Может WebView2 ?
https://learn.microsoft.com/ru-ru/mi...arted/winforms

или задействовать .net контрол WebBrowser (там есть готовые методы NavigateToString и NavigateToStream)
https://learn.microsoft.com/en-us/do...stem-io-stream)
https://learn.microsoft.com/en-us/do...(system-string)


P.S.
Зачем понадобился весь этот гемор.
Хотелось обойтись без сохранения html текста во временный файл, а сразу из X++ переменной подставлять созданный html

Архив с файликами выложил (на форуме уже места нет для моих вложений) сюда :
https://github.com/KozlovPavel677/Ax2012_WebBrowser

Последний раз редактировалось Logger; 07.02.2024 в 18:28.
За это сообщение автора поблагодарили: Товарищ ♂uatr (14).
Старый 07.02.2024, 18:57   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Наш верстальщик нашел обходной способ
добавить
Цитата:
style="border:none"
т.е. для картинки вместо
PHP код:
<img src="U:\Test\assets\images\stack\Stack_Green_3.png" alt="Stack_Green_3.png" 
написать

PHP код:
<img src="U:\Test\assets\images\stack\Stack_Green_3.png" alt="Stack_Green_3.png" style="border:none" 
тогда одинаково выглядит.
Старый 08.02.2024, 15:01   #3  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
268 / 829 (28) +++++++
Регистрация: 23.10.2012
Привет.
Мы наоборот понижали версию IE до совместимой с Аксаптой в своих реализациях страниц.
ActiveX Web browser - это же %Windir%\System32\ieframe.dll?
Старый 08.02.2024, 15:30   #4  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Насколько я помню, ActiveX WebBrowser реализован на основании API какого-то древнего IE (кажется 7го) и заставить его отображать страницы, как это делают современные браузеры, не получится. Он для этого и добавляет к станице режим совместимости, потому что по другому отображать не умеет. Поэтому style="border:none", в данном случае, вполне нормальный вариант, по-моему
За это сообщение автора поблагодарили: Logger (3).
Старый 08.02.2024, 18:36   #5  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
268 / 829 (28) +++++++
Регистрация: 23.10.2012
Версия ieframe.dll зависит от версии OS.
Webview2 - для целей Аксапты подходит тот, что относится к windows forms (Microsoft.Web.WebView2.WinForms).
Целевой объект, который нужно добавить в Аксапту - Microsoft.Web.WebView2.WinForms.WebView2, наследник от System.Windows.Forms.Control.
Проблема здесь в связи этого объекта, который создать не сложно, с самой формой.

В windows forms форма - класс наследник от System.Windows.Forms.Form, она же является наследником от System.Windows.Forms.Control.
Только форма Аксапты что-то своё.
Объектов Аксапты наследованных от System.Windows.Forms.Control по пальцам пересчитать. Как ни странно один из таких объектов - ActionPane.
В теории можно сконвертировать ActionPane в System.Windows.Forms.Control
X++:
ptr = new System.IntPtr(ActionPane.hWnd());
control = System.Windows.Forms.Control::FromHandle(ptr);
Получить ссылку на список контролов входящих в состав данного:
X++:
collection = control.get_Controls();
где collection это System.Windows.Forms.Layout.ArrangedElementCollection.
Ну и добавить в него созданный экземляр webview2 через функцию add.
Выглядит куда проще инициализировать саму форму .net из X++ и добавить в целевой контрол.

Последний раз редактировалось Товарищ ♂uatr; 08.02.2024 в 18:39.
За это сообщение автора поблагодарили: Logger (10).
Старый 08.02.2024, 21:18   #6  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
268 / 829 (28) +++++++
Регистрация: 23.10.2012
Не работает у меня указанный выше способ в 2009, в отличии от 2012, но в 2012 он не имеет никакого смысла по причине наличия ManagedHostControl'ов.
За это сообщение автора поблагодарили: Logger (15).
Теги
activex, webbrowser

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX2009 Странное поведение пакетного сервера Raven Melancholic DAX: Администрирование 7 06.11.2019 22:32
ax2012 и activex в пакетной обработке Omeo DAX: Программирование 8 17.09.2015 11:10
Странное поведение при обновлении форм ах2009 DmitryK DAX: Функционал 26 18.03.2013 15:48
Странное поведение ttsAbort Logger DAX: Программирование 6 28.05.2009 15:11
Странное поведение резервирования после создания спланированной закупки. NEO DAX: Функционал 7 01.07.2004 14:03

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:03.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.