
Встроенный браузер в приложении на Ассемблере

Встроенный браузер в приложении на Ассемблере
Сегодня будем рисовать свой браузер, а точнее внедрять фрейм web-браузера в интерфейс нашего приложения. Нечто подобное мы уже делали, но там были отдельные страницы, а сейчас полноценный браузер, встроенный в приложение. Языком исполнения, естественно, будет Ассемблер.
Браузер, встраиваемый в приложение, работает на движке Internet Explorer, а точнее на его системном компоненте IECore. Доступ к этому объекту осуществляется через COM-интерфейсы IWebBrowser2. Начинаем с описания структур и интерфейсов, которые понадобятся нам для дальнейшей работы.
Code (Assembler) : Убрать нумерацию
- struct DECIMAL
- wReserved dw ?
- union
- struct
- scale db ?
- sign db ?
- ends
- signscale dw ?
- ends
- Hi32 dd ?
- union
- struct
- Lo32 dd ?
- Mid32 dd ?
- ends
- Lo64 dq ?
- ends
- ends
- struct VARIANT
- union
- struct
- vt dw ?
- wReserved rw 3
- union
- llVal dq ?
- lVal dd ?
- iVal dw ?
- bVal db ?
- ends
- ends
- decVal DECIMAL
- ends
- ends
- ; GUID {8856F961-340A-11D0-A96B-00C04FD705A2}
- CLSID_WebBrowser dd 08856F961h
- dw 0340Ah
- dw 011D0h
- db 0A9h, 06Bh, 000h, 0C0h, 04Fh, 0D7h, 005h, 0A2h
- ; GUID {D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}
- IID_IWebBrowser2 dd 0D30C1661h
- dw 0CDAFh
- dw 011D0h
- db 08Ah, 03Eh, 000h, 0C0h, 04Fh, 0C9h, 0E2h, 06Eh
- ; IID_IWebBrowser2 Interface
- struct IWebBrowser2
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWebBrowser2
- GetTypeInfoCount dd ? ; 00Ch
- GetTypeInfo dd ? ; 010h
- GetIDsOfNames dd ? ; 014h
- _Invoke dd ? ; 018h
- GoBack dd ? ; 01Ch
- GoForward dd ? ; 020h
- GoHome dd ? ; 024h
- GoSearch dd ? ; 028h
- Navigate dd ? ; 02Ch
- Refresh dd ? ; 030h
- Refresh2 dd ? ; 034h
- Stop dd ? ; 038h
- get_Application dd ? ; 03Ch
- get_Parent dd ? ; 040h
- get_Container dd ? ; 044h
- get_Document dd ? ; 048h
- get_TopLevelContainer dd ? ; 04Ch
- get_Type dd ? ; 050h
- get_Left dd ? ; 054h
- put_Left dd ? ; 058h
- get_Top dd ? ; 05Ch
- put_Top dd ? ; 060h
- get_Width dd ? ; 064h
- put_Width dd ? ; 068h
- get_Height dd ? ; 06Ch
- put_Height dd ? ; 070h
- get_LocationName dd ? ; 074h
- get_LocationURL dd ? ; 078h
- get_Busy dd ? ; 07Ch
- Quit dd ? ; 080h
- ClientToWindow dd ? ; 084h
- PutProperty dd ? ; 088h
- GetProperty dd ? ; 08Ch
- get_Name dd ? ; 090h
- get_HWND dd ? ; 094h
- get_FullName dd ? ; 098h
- get_Path dd ? ; 09Ch
- get_Visible dd ? ; 0A0h
- put_Visible dd ? ; 0A4h
- get_StatusBar dd ? ; 0A8h
- put_StatusBar dd ? ; 0ACh
- get_StatusText dd ? ; 0B0h
- put_StatusText dd ? ; 0B4h
- get_ToolBar dd ? ; 0B8h
- put_ToolBar dd ? ; 0BCh
- get_MenuBar dd ? ; 0C0h
- put_MenuBar dd ? ; 0C4h
- get_FullScreen dd ? ; 0C8h
- put_FullScreen dd ? ; 0CCh
- Navigate2 dd ? ; 0D0h
- QueryStatusWB dd ? ; 0D4h
- ExecWB dd ? ; 0D8h
- ShowBrowserBar dd ? ; 0DCh
- get_ReadyState dd ? ; 0E0h
- get_Offline dd ? ; 0E4h
- put_Offline dd ? ; 0E8h
- get_Silent dd ? ; 0ECh
- put_Silent dd ? ; 0F0h
- get_RegisterAsBrowser dd ? ; 0F4h
- put_RegisterAsBrowser dd ? ; 0F8h
- get_RegisterAsDropTarget dd ? ; 0FCh
- put_RegisterAsDropTarget dd ? ; 100h
- get_TheaterMode dd ? ; 104h
- put_TheaterMode dd ? ; 108h
- get_AddressBar dd ? ; 10Ch
- put_AddressBar dd ? ; 110h
- get_Resizable dd ? ; 114h
- put_Resizable dd ? ; 118h
- ends
Code (Assembler) : Убрать нумерацию
- invoke CoInitialize,0
- ; Создать объект браузера
- invoke CoCreateInstance,CLSID_WebBrowser,NULL,\
- CLSCTX_ALL,IID_IWebBrowser2,pBrowser
- cmp eax,S_OK
- jne loc_error
Code (Assembler) : Убрать нумерацию
- ; Инициализировать составные элементы управления
- invoke AtlAxWinInit
- ; Подключить встроенный браузер к элементу STATIC
- invoke GetDlgItem,[hwnddlg],ID_BROWSER
- invoke AtlAxAttachControl,[pBrowser],eax,0
Осталось включить видимость фрейма браузера и передать ему команду на переход по указанной ссылке. Ссылка может быть как на удаленный сервер, так и на локальный файл или на ресурс в локальной сети. Короче, все, что может открыть "большой" браузер, может быть открыто и во встроенном браузере. Синтаксис ссылок тот же самый. Для продвинутых запросов можно сформировать дополнительные заголовки, передать куки или набор данных для POST-формы. Формат открываемых файлов также соответствует возможностям полноценного браузера. Например, используя эту технологию, я нарисовал для своих нужд очень шустрый и компактный просмотрщик SVG-файлов.
Code (Assembler) : Убрать нумерацию
- VT_BSTR = 8
- VARIANT_TRUE = -1
- szURL du 'https://yandex.ru',0
- vtURL VARIANT
- ...
- ...
- ; Включить видимость
- mov eax,[pBrowser]
- mov eax,[eax]
- stdcall dword [eax+IWebBrowser2.put_Visible],[pBrowser],VARIANT_TRUE
- ; Открыть указанную страницу
- mov [vtURL.vt],VT_BSTR
- mov [vtURL.lVal],szURL
- mov eax,[pBrowser]
- mov eax,[eax]
- stdcall dword [eax+IWebBrowser2.Navigate2],[pBrowser],vtURL,0,0,0,0
Code (Assembler) : Убрать нумерацию
- mov eax,[pBrowser]
- mov eax,[eax]
- stdcall dword [eax+IWebBrowser2.get_ReadyState],[pBrowser],dState
- ; Страница загружена?
- cmp [dState],READYSTATE_COMPLETE
- je page_loaded
Code (Assembler) : Убрать нумерацию
- mov eax,[pBrowser]
- mov eax,[eax]
- stdcall dword [eax+IWebBrowser2.Release],[pBrowser]
- invoke CoUninitialize
В приложении пример программы с исходным текстом, которая создает окно с двумя встроенными независимыми браузерами.
Просмотров: 1389 | Комментариев: 9

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(11.07.2022 в 14:23):
Это ж демонстрашка браузеров, поэтому так и задумано. Для разворотов надо рисовать обработчики на WM_SIZE, динамически подгонять размеры элементов под новые размеры и все такое прочее. Тут тема совсем не про это, незачем загромождать исходники лишним кодом.

Kemper
(11.07.2022 в 14:18):
А чего на фулскрин не разворачивает - или так и задумано?

ManHunter
(07.07.2022 в 14:29):
А вообще очень удобная штука получилась. На сервере крутится скрипт, который делает свою работу и по итогам дает какой-то выхлоп. На десктопе висит маленькое окошко-виджет, в котором открыта web-морда этого скрипта и периодически обновляется.

кодер
(07.07.2022 в 13:11):
Хромовский движок - это если обязательно нужна полноценная поддержка современного веба. Да, для узкоспециализированных задач, IE - вполне себе вариант.
Вот что майкрософт сейчас мутит с Win32 API:
Раньше разработчикам приходилось выбирать между классической архитектурой Win32, совместимой с прошлыми версиями Windows, и UWP, работающей на Windows 10. Платформа Project Reunion должна объединить программные интерфейсы Win32 и UWP и сохранить обратную совместимость.
В состав Project Reunion включен компонент WebView2 - с его помощью любое приложение Windows будет поддерживать веб-контент через встроенный Microsoft Edge и Chromium.
Там вроде бы как вызовы Win32 API хитро транслируются на новую платформу. Т.е. некоторые старые программы C++ теоретически можно просто перекомпилировать, ничего не изменяя. Не знаю, зайдёт ли эта новая "технология" в массы, или будет как всегда, посмотрим. :)
Да, сейчас Project Reunion называется Windows App SDK.
https://en.wikipedia.org/wiki/Windows_App_SDK
https://docs.microsoft.com/en-...ows-app-sdk/
Вот что майкрософт сейчас мутит с Win32 API:
Раньше разработчикам приходилось выбирать между классической архитектурой Win32, совместимой с прошлыми версиями Windows, и UWP, работающей на Windows 10. Платформа Project Reunion должна объединить программные интерфейсы Win32 и UWP и сохранить обратную совместимость.
В состав Project Reunion включен компонент WebView2 - с его помощью любое приложение Windows будет поддерживать веб-контент через встроенный Microsoft Edge и Chromium.
Там вроде бы как вызовы Win32 API хитро транслируются на новую платформу. Т.е. некоторые старые программы C++ теоретически можно просто перекомпилировать, ничего не изменяя. Не знаю, зайдёт ли эта новая "технология" в массы, или будет как всегда, посмотрим. :)
Да, сейчас Project Reunion называется Windows App SDK.
https://en.wikipedia.org/wiki/Windows_App_SDK
https://docs.microsoft.com/en-...ows-app-sdk/

ManHunter
(07.07.2022 в 11:26):
Тогда не вижу причины для паники и необходимости перехода на хромовский движок. Вон, TheBat перешли, сразу дистрибутив x3 и до сих пор баги вычистить не могут. Периодически ставлю новые версии, плююсь, удаляю и откатываюсь на 9.1

кодер
(07.07.2022 в 11:21):
Конечно работает. Более того, скорее всего IE никогда и не выпилят из Windows, потому что даже некоторые гос. учреждения до сих пор завязаны на ActiveX IE.
Однако IE скорее всего не будет открывать некоторые https сайты с новым TLS, и появятся сложности с поддержкой новых версий JS/CSS.
Однако IE скорее всего не будет открывать некоторые https сайты с новым TLS, и появятся сложности с поддержкой новых версий JS/CSS.

User
(07.07.2022 в 10:02):

ManHunter
(06.07.2022 в 21:10):
С чего бы вдруг? Под Win10 все прекрасно работает. И в MSDN ни слова про deprecated.

кодер
(06.07.2022 в 19:01):
Это IE (который с 15 июня официально уже deprecated). А c Edge такое вроде уже и не сработает. Вообще майкрософт не поймёшь, клепают технологии-однодневки. То ли они забросили свой COM+/OLE, то ли будут его как-то реанимировать - ничего не понятно. В итоге смотрю в сторону Chromium Embedded Framework (сокр. CEF) - открытый фреймворк для встраивания в приложение браузерного движка из проекта Chromium.

Добавить комментарий
Заполните форму для добавления комментария
