AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 07.02.2024, 17:56   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,996 / 3293 (117) ++++++++++
Join Date: 12.10.2004
Location: Москва
Blog Entries: 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/
Quote:
PHP Code:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 
Тег должен находиться в секции head страницы перед всеми остальными элементами, за исключением title и других мета-элементов. В противном случае он игнорируется!
Вроде бы мы нашли причину?
Пробуем исправить.
Делаем свой файлик пустышку, который используем для инициализации контрола вместо res://mshtml.dll/blank.htm, прописывая в его заголовке нужный нам режим совместимости
PHP Code:
<meta http-equiv="X-UA-Compatible" content="ie=edge"
, чтобы затем уже подсунуть ему в SysHelp::insertHTML2Document нужный нам сгенерированный html
И!

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

Так
PHP Code:
<!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 Code:
<html>
<
head>
<
meta http-equiv="X-UA-Compatible" content="ie=edge" />
</
head>
<
body></body>
</
html
так
PHP Code:
<HTML>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
</
HTML
и так
PHP Code:
<HTML>
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
</
HTML
и эдак
PHP Code:
<!doctype html>
<
HTML>
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
</
HTML
и вот так
PHP Code:
<!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
все валится с ошибкой :
Quote:
"Число аргументов, указанных в вызове функции, отличается от числа аргументов в объявлении метода."
т.е. явно почему-то пришел объект другого типа.

Похоже у 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

Last edited by Logger; 07.02.2024 at 18:28.
This post has been rated by: Товарищ ♂uatr (14).
Old 07.02.2024, 18:57   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,996 / 3293 (117) ++++++++++
Join Date: 12.10.2004
Location: Москва
Blog Entries: 2
Наш верстальщик нашел обходной способ
добавить
Quote:
style="border:none"
т.е. для картинки вместо
PHP Code:
<img src="U:\Test\assets\images\stack\Stack_Green_3.png" alt="Stack_Green_3.png" 
написать

PHP Code:
<img src="U:\Test\assets\images\stack\Stack_Green_3.png" alt="Stack_Green_3.png" style="border:none" 
тогда одинаково выглядит.
Old 08.02.2024, 15:01   #3  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Товарищ ♂uatr's Avatar
MCBMSS
 
337 / 915 (31) +++++++
Join Date: 23.10.2012
Привет.
Мы наоборот понижали версию IE до совместимой с Аксаптой в своих реализациях страниц.
ActiveX Web browser - это же %Windir%\System32\ieframe.dll?
Old 08.02.2024, 15:30   #4  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Join Date: 21.10.2004
Насколько я помню, ActiveX WebBrowser реализован на основании API какого-то древнего IE (кажется 7го) и заставить его отображать страницы, как это делают современные браузеры, не получится. Он для этого и добавляет к станице режим совместимости, потому что по другому отображать не умеет. Поэтому style="border:none", в данном случае, вполне нормальный вариант, по-моему
This post has been rated by: Logger (3).
Old 08.02.2024, 18:36   #5  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Товарищ ♂uatr's Avatar
MCBMSS
 
337 / 915 (31) +++++++
Join Date: 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++ и добавить в целевой контрол.

Last edited by Товарищ ♂uatr; 08.02.2024 at 18:39.
This post has been rated by: Logger (10).
Old 08.02.2024, 21:18   #6  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Товарищ ♂uatr's Avatar
MCBMSS
 
337 / 915 (31) +++++++
Join Date: 23.10.2012
Не работает у меня указанный выше способ в 2009, в отличии от 2012, но в 2012 он не имеет никакого смысла по причине наличия ManagedHostControl'ов.
This post has been rated by: Logger (15).
Tags
activex, webbrowser

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 23:56.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.