FreeBasic
Главная
Вход
Регистрация
Пятница, 19.04.2024, 04:47Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Получить объект Internet Explorer_Server
Получить объект Internet Explorer_Server
WQДата: Пятница, 19.12.2014, 20:21 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Есть чужое окно с Internet Explorer_Server.
Нужно получить объект IE для дальнейшего использования с помощью disphelper

На англоязычном форуме ничего подходящего не нашлось
Нашел код здесь http://support.microsoft.com/kb/249232 
но квалификации не хватает для переписывания на FB.
Если удастся внедрить подобную функцию, то, наконец, программа будет завершена smile


Сообщение отредактировал WQ - Пятница, 19.12.2014, 20:29
 
haavДата: Суббота, 20.12.2014, 00:06 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Код
#Include "window9.bi"
#Include "win/oleacc.bi"
Dim Shared As Integer ptr bra
Dim Shared As Integer event
Dim shared As hwnd hWndChild, hwnd
hwnd=OpenWindow("WebGadget",10,10,800,600) : CenterWindow(hwnd)
bra=WebGadget(1,10,50,760,500,"bing.com",WS_VSCROLL Or WS_HSCROLL,WS_EX_CLIENTEDGE)
ButtonGadget(3,10,10,50,20,"Get")

Function EnumChildProc Cdecl( hwnd As hwnd, lparam  As lParam) As bool
  Dim As ZString*100 buf
  GetClassName( hwnd, @buf, 100 )
  If buf = "Internet Explorer_Server" Then
   hWndChild = hwnd
   Return FALSE
  Else
   Return TRUE
  EndIf
End function

Do
  event=WaitEvent()
  If Event=EventClose Then
   End
  ElseIf  Event=EventGadget Then
   Select Case EventNumber
    Case 3
     CoInitialize( NULL )
     Dim As HINSTANCE hInst = LoadLibrary("OLEACC.DLL" )
     Dim msg As UINT
     Dim R As  Integer
     Dim hr As HRESULT
     Dim spDoc As IHTMLDocument2 Ptr
     Dim As wString Ptr sUrl
              EnumChildWindows( hWnd, Cast(Any Ptr,@EnumChildProc), 0 )
     msg = RegisterWindowMessage("WM_HTML_GETOBJECT")
     SendMessageTimeout(hWndChild, msg, 0, 0, SMTO_ABORTIFHUNG, 1000, @R)
     hr = ObjectFromLresult(R, @IID_IHTMLDocument, 0, @spDoc)    
     spDoc->lpVtbl->get_url(spDoc,@sUrl)
     MessBox("",*sUrl)
     CoUninitialize()
     FreeLibrary( hInst)
   End Select
  EndIf
Loop


Данный код получает указатель на интерфейс IHTMLDocument2 . Со своим окном все работает нормально и строка получения URL (spDoc->lpVtbl->get_url(spDoc,@sUrl)) срабатывает. Но в чужом окне программа начинает валиться на строке получения URL, хотя интерфейс IHTMLDocument2 получает. С чужими окнами надо как-то по другому. Возможно надо получать какие-то разрешения или вообще использовать другой метод. В общем чем смог, помог, лезть дальше в эти дебри неохота.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Суббота, 20.12.2014, 13:08 | Сообщение # 3
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Огромное спасибо! Все получилось. Мне url напрямую не нужен, добавил disphelper, получил объект IE, а дальше с ним можно что угодно делать.
В примере ниже после запуска справки по Window9 можно перейти на произвольную страницу или изменить масштаб страницы.

Код
#Include "window9.bi"
#Include "win/oleacc.bi"

Dim Shared As Integer Ptr bra
Dim Shared As Integer event
Dim Shared As hwnd hWndChild, hwnd, hParent
hwnd=OpenWindow("WebGadget",10,10,200,170)
CenterWindow(hwnd)
ButtonGadget(3,10,10,100,30,"Navigate")
ButtonGadget(4,10,50,80,30,"Zoom +")
ButtonGadget(5,100,50,80,30,"Zoom -")

Function EnumChildProc Cdecl(hwnd As hwnd, lparam  As lParam) As bool
    Dim As ZString*100 buf
    GetClassName(hwnd, @buf, 100)
    If buf = "Internet Explorer_Server" Then
       hWndChild = hwnd       
       Return FALSE
    Else
       Return TRUE
    EndIf
End Function

#define UNICODE
#Include Once "disphelper/disphelper.bi"
Dim Shared As IDispatch Ptr ieApp, spParent
Dim spDoc As IHTMLDocument2 Ptr
dhInitialize(TRUE)
dhToggleExceptions(TRUE)
Dim zoom As Double = 1

CoInitialize( NULL )
Dim As HINSTANCE hInst = LoadLibrary("OLEACC.DLL" )
Dim msg As UINT
Dim R As  Integer
Dim hr As HRESULT
Dim As WString Ptr sUrl

hParent=FindWindow("HH Parent", "Window9 Gui Library")

If hParent=0 Then  
  MessBox("","Окно справки отсутствует!")
    End  
EndIf

EnumChildWindows(hParent, Cast(Any Ptr,@EnumChildProc), 0)
msg = RegisterWindowMessage("WM_HTML_GETOBJECT")
SendMessageTimeout(hWndChild, msg, 0, 0, SMTO_ABORTIFHUNG, 1000, @R)
hr = ObjectFromLresult(R, @IID_IHTMLDocument, 0, @spDoc)
'spDoc->lpVtbl->get_url(spDoc,@sUrl)

spDoc->lpVtbl->get_script(spDoc,@spParent)
dhGetValue("%o",@ieApp,spParent,".document.parentwindow")

CoUninitialize()
FreeLibrary( hInst)

If ieApp=0 Then  
    MessBox("","Получить объект не удалось!")
    End  
EndIf

Do
    event=WaitEvent()
    If Event=EventClose Then
       End
    ElseIf  Event=EventGadget Then
       Select Case EventNumber
          Case 3
             Var urltext="Informationaboutthedevelopers.htm"             
             dhCallMethod(ieApp,"Navigate(%s)",urltext)
          Case 4
             zoom += 0.1
             dhPutValue(ieApp, "document.body.style.zoom = %s", Str(zoom))
          Case 5
             zoom -= 0.1
             dhPutValue(ieApp, "document.body.style.zoom = %s", Str(zoom))
       End Select
    EndIf
Loop

В Window9 есть функции для работы с chm, но почему-то у меня они работают только на Win 7, на Win XP и Win 8 не работают.
 
haavДата: Суббота, 20.12.2014, 13:51 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата WQ ()
В Window9 есть функции для работы с chm, но почему-то у меня они работают только на Win 7, на Win XP и Win 8 не работают.


На win8 проверить не могу, но на XP и Win7 функции работают как задумано. Проверил на 2 компьютерах.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Суббота, 20.12.2014, 14:11 | Сообщение # 5
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Цитата haav ()
На win8 проверить не могу, но на XP и Win7 функции работают как задумано. Проверил на 2 компьютерах.

Тьфу! Действительно, работает, и на Win 8 тоже. Оказывается, у меня в пути до .chm была ошибка(
Ну, ничего, теперь знаю как на FB к IE можно подключаться  smile
 
Форум » Freebasic » Вопросы по языку FreeBasic » Получить объект Internet Explorer_Server
  • Страница 1 из 1
  • 1
Поиск: