Заметки
Миф о TWebBrowser

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика


При разработке тонкого клиента на основе TWebBrowser довелось столкнуться с неприятной ситуацией, суть которой заключалась в некорректном отображении загруженной страницы в этом компоненте. Я все время думал, что TWebBrowser использует движок той версии IE, которая установлена в системе. В моем случае был установлен IE11, в котором исходная страница отображалась корректно, и каково же было мое удивление, когда в моем клиенте контент страницы “поплыл”.

Поиск причины показал следующее – TWebBrowser использует интерфейсы от старых версий IE! Так, например, в Delphi XE3 (и, похоже, во всех более поздних версиях), TWebBrowser использует интерфейсы IWebBrowser2 от IE7. Более старые версии (Delphi XE2 и ниже) используют интерфейс от IE6 и ниже (Delphi 7, возможно, использует интерфейс от IE4).

Понятно, что старые версии IE не понимают новых стандартов вроде CSS3, HTML5 и т.п., в итоге мы видим не то, что ожидали. Так что утверждение о том, что TWebBrowser использует движок той версии IE, которая установлена в системе – не более чем миф.

Решение заключается в эмуляции требуемой версии IE, для чего необходимо немного пошаманить в реестре. Шаманить можно либо на уровне всей системы, работая с разделом HKEY_LOCAL_MACHINE (для этого потребуются права администратора) или на уровне пользователя, работая с разделом HKEY_CURRENT_USER (права администратора не нужны). Кроме того, следует учитывать, совпадает ли разрядность приложения, для которого устанавливается режим эмуляции, с разрядностью ОС. Посмотрим на примеры.

// Эмуляция на уровне системы, разрядность приложения и ОС совпадают:
HKLM\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

// Эмуляция на уровне системы, разрядность приложения и ОС не совпадают (приложение x86 в ОС x64):
HKLM\Software\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

// Эмуляция на уровне пользователя, разрядность приложения и ОС совпадают:
HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

// Эмуляция на уровне пользователя, разрядность приложения и ОС не совпадают (приложение x86 в ОС x64):
HKCU\Software\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

В выбранном(ых) разделе(ах) нужно создать параметр типа DWORD вида:

имя_файла.exe = версия эмулируемого браузера для него

К примеру, запись:

myapp.exe = 11001

означает, что для myapp.exe будет эмулироваться IE11. Значения параметра можно посмотреть здесь.

Значение Описание
11001
(0x2AF9)
Веб-страницы отображаются в режиме IE11, независимо от заявленного <!DOCTYPE>.
11000
(0x2AF8)
Веб-страницы, содержащие стандартные директивы <!DOCTYPE>, отображаются в режиме IE11 (является значением по умолчанию для IE11).
10001
(0x2711)
Веб-страницы отображаются в режиме IE10, независимо от заявленного <!DOCTYPE>.
10000
(0x02710)
Веб-страниц, содержащие стандартные директивы <!DOCTYPE>, отображаются в режиме IE10 (является значением по умолчанию для IE10).
9999
(0x270F)
Веб-страницы отображаются в режиме IE9, независимо от заявленного <!DOCTYPE>.
9000
(0x2328)
Веб-страницы, содержащие стандартные директивы <!DOCTYPE>, отображаются в режиме IE9 (является значением по умолчанию для IE9).
Важно: в IE10 веб-страницы, содержащие стандартные директивы <!DOCTYPE>, отображаются в режиме IE10.
8888
(0x22B8)
Веб-страницы отображаются в режиме IE8, независимо от заявленного <!DOCTYPE>.
8000
(0x1F40)
Веб-страницы, содержащие стандартные директивы <!DOCTYPE>, отображаются в режиме IE8 (яаляется значением по умолчанию для IE8).
Важно: в IE10 веб-страницы, содержащие стандартные директивы <!DOCTYPE>, отображаются в режиме стандартов IE10.
7000
(0x1B58)
Веб-страницы, содержащие стандартные директивы <!DOCTYPE>, отображаются в режиме IE7 (является значением по умолчанию для приложений, содержащих элемент управления WebBrowser).

Что еще следует иметь ввиду?

  • Минимальная версия IE, для которого возможна эмуляция – IE 8. Потому на Windows XP/Server 2003 нужно ставить IE 8 (максимальная версия IE, которую можно поставить на более “древние” ОС – IE8);
  • На Windows 7 и выше можно ставить IE 11. Чтобы использовать эмуляцию 11-го IE, он (IE11) должен быть установлен в системе.

Поэтому перед установкой режима эмуляции следует определить версию ОС и установленного IE (на основании этой информации можно понять, какие версии IE можно эмулировать).

Однако все вышеописанное не гарантирует отсутствие проблем при отображении контента в эмулируемой версии IE. Так, могут иметь место проблемы, связанные с рисованием на канве непосредственно в браузере, будьте к этому готовы.

На этом все, удачных эмуляций!

При использовании материала - ссылка на сайт обязательна