(NET) NET (2006 год)

Программирование в среде браузера

На .NET Framework программирование возможно в весьма различных средах: Есть также множество тесно связананных технологий, без которых программировать профессиональные приложения не получится, но не являющихся непосредственно NET-кодом:
На этой страничке будет рассмотрена техника специализированного программирования в среде браузера IE7.

Прежде всего с браузером можно работать, загрузив браузер ВО ВНУТРЬ своей проги. Примеров такой техники у меня на сайте лежит множество, в том числе SiteChecker - утилита с открытым исходным кодом. В сущности для такого доступа к браузеру надо просто установить ссылку на библиотеку Interop.SHDocVw и поместить на свою форму контрол WebBrowser.


Однако, примерно по аналогии с офисом, можно сделать и НАОБОРОТ - подключить свою собственную прогу ВО ВНУТРЬ работающего браузера. Это можно сделать многими способами способами:

Разумеется, тут речь идет о подключении своей проги во-внутрь работающего браузера, и о работе подключенной проги КАК WIN-приложения а не о работе в клиентской среде браузера на скриптовом языке. Кстати, со страниц тоже возможно работать в среде WIN-приложений по крайней мере двумя способами:


В практическом плане в браузере как правило подключены десятки сторонних программ:




Прежде всего надо понимать, что наша кнопка будет непосредственно взаимодействать с внутренними обьектами браузера. Если этого не надо, а надо просто выхвать стронний EXE-файл, то это делается совершенно иначе - оснасткой GPEDIT.MSC.

Но мы сделаем свою NET-прогу, которая будет работать именно внутри среды браузера, имея доступ ко всем его обьектам - тулбару, документу и проч. Для начала нас ждет неожиданность - стандартные размеры иконок не подходят. Однако, я уже подготовил иконки специальных размеров, сгрузить которые можно ОТСЮДА.

В MSDN описано, как именно это сделать. Вот собственно это скудное описание:




Вся сложность в том, что нам придется заниматься COM-программированием в среде NET. Вообще эта задача не раз освещена у меня на сайте, но тут мы посмотрим все это в конкретике браузера. Итак, создадим COM-объект, который будет вызываться нашей кнопкой:

Собственно текст регистрации (с моими путями иконок выглядит вот так):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Extensions\{E755B4B7-F72C-4946-A84D-87ACF80934B0}]
"Default Visible"="Yes"
"ButtonText"="MyButton1"
"CLSID"="{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}"
"ClsidExtension"="{6245A388-C461-4116-BC59-24F5F0C036A4}"
"Icon"="F:\\Visual Studio 2005\\Projects\\IE7TollbarButton\\IE7TollbarButton\\Resources\\3c.ico"
"HotIcon"="F:\\Visual Studio 2005\\Projects\\IE7TollbarButton\\IE7TollbarButton\\Resources\\3g.ico"

А текст нашей проги, о которой мы так долго говорим - так:

00001: <ComClass("6245A388-C461-4116-BC59-24F5F0C036A4")> _
00002: Public Class Button1
00003:     Implements IOleCommandTarget, IObjectWithSite
00004: 
00005:     Public Sub Exec(ByRef pguidCmdGroup As System.Guid, ByVal nCmdId As UInteger, ByVal nCmdExecOpt As UInteger, ByRef pvaIn As Object, ByRef pvaOut As Object) Implements IOleCommandTarget.Exec
00006:         My.Computer.Clipboard.SetText("Exec")
00007:     End Sub
00008: 
00009:     Public Sub QueryStatus(ByRef pguidCmdGroup As System.Guid, ByVal cCmds As UInteger, ByVal prgCmds() As OLECMD, ByRef pCmdText As OLECMDTEXT) Implements IOleCommandTarget.QueryStatus
00010:         My.Computer.Clipboard.SetText("QueryStatus")
00011:     End Sub
00012: 
00013:     Public Sub SetSite(ByVal pUnkSite As Object) Implements IObjectWithSite.SetSite
00014:         Try
00015:             My.Computer.Clipboard.SetText(pUnkSite.ToString)
00016:             Dim X As IInputObjectSite = TryCast(pUnkSite, IInputObjectSite)
00017:             Dim Y As _IServiceProvider = TryCast(X, _IServiceProvider)
00018:             Dim IE7 As Object
00019:             Y.QueryService(New Guid("{0002DF05-0000-0000-C000-000000000046}"), _
00020:             New Guid("{00000000-0000-0000-C000-000000000046}"), IE7)
00021:             Dim HTMLDocument As mshtml.HTMLDocumentClass
00022:             HTMLDocument = TryCast(IE7, SHDocVw.WebBrowser).Document
00023:             My.Computer.Clipboard.SetText(HTMLDocument.documentElement.outerHTML)
00024:         Catch ex As Exception
00025:             My.Computer.Clipboard.SetText(ex.Message)
00026:         End Try
00027: 
00028:     End Sub
00029: End Class
00030: 
00031: <Runtime.InteropServices.ComImport(), Runtime.InteropServices.Guid("6d5140c1-7436-11ce-8034-00aa006009fa"), Runtime.InteropServices.InterfaceType(Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)> _
00032: Public Interface _IServiceProvider
00033:     Sub QueryService(ByRef guid As Guid, ByRef riid As Guid, <Runtime.InteropServices.Out(), Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.Interface)> ByRef Obj As Object)
00034: End Interface
00035: 
00036: <Runtime.InteropServices.ComImport(), Runtime.InteropServices.InterfaceType(Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown), Runtime.InteropServices.Guid("f1db8392-7331-11d0-8c99-00a0c92dbfe8")> _
00037: Public Interface IInputObjectSite
00038:     <Runtime.InteropServices.PreserveSig()> _
00039:     Function OnFocusChangeIS(<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.IUnknown)> ByVal punkObj As Object, ByVal fSetFocus As Integer) As Integer
00040: End Interface
00041: 
00042: <Runtime.InteropServices.ComImport(), _
00043: Runtime.InteropServices.Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"), _
00044: Runtime.InteropServices.InterfaceType(Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)> _
00045: Public Interface IOleCommandTarget
00046: 
00047:     Sub QueryStatus(ByRef pguidCmdGroup As Guid, ByVal cCmds As UInt32, _
00048:     <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.LPArray, _
00049:     SizeParamIndex:=1)> ByVal prgCmds() As OLECMD, ByRef pCmdText As OLECMDTEXT)
00050: 
00051:     Sub Exec(ByRef pguidCmdGroup As Guid, ByVal nCmdId As UInt32, ByVal nCmdExecOpt As UInt32, _
00052:     ByRef pvaIn As Object, ByRef pvaOut As Object)
00053: 
00054: End Interface
00055: 
00056: <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential, _
00057: CharSet:=Runtime.InteropServices.CharSet.Unicode)> _
00058: Public Structure OLECMDTEXT
00059:     Public cmdtextf As UInt32
00060:     Public cwActual As UInt32
00061:     Public cwBuf As UInt32
00062:     <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=100)> _
00063:     Public rgwz As Char
00064: End Structure
00065: 
00066: <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
00067: Public Structure OLECMD
00068:     Public cmdID As UInt32
00069:     Public cmdf As UInt32
00070: End Structure
00071: 
00072: <Runtime.InteropServices.ComImport(), _
00073: Runtime.InteropServices.Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352"), _
00074: Runtime.InteropServices.InterfaceType(Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)> _
00075: Public Interface IObjectWithSite
00076:     Sub SetSite(<Runtime.InteropServices.[In](), _
00077:     Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.IUnknown)> ByVal pUnkSite As Object)
00078: End Interface





Комментарии к этой страничке ( )
ссылка на эту страничку: http://www.vb-net.ru/windows/IE/index.htm
<Назад>  <На главную>  <В раздел ASP>  <В раздел NET>  <В раздел SQL>  <В раздел Разное>  <Написать автору>  < Поблагодарить>
Московская хельсинская группа   Радио Свобода  Новая газета   The New Times (Новое время)