Шустрый

Профиль
Группа: Участник
Сообщений: 76
Регистрация: 21.11.2006
Репутация: нет Всего: нет
|
Есть код с запуском InternetExplorer.Application, далее пытаюсь получить экземпляр IHtmlDocument2 из HWND, проблема в том что при запуске кода из проекта где используется форма получаем этот экземпляр, если проект без формы, то возвращает null, вопрос как это побороть? Пробовал и ShellExecutre запускать InternetExplorer и получать экземпляр IHtmlDocument2 из HWND, таже ситуация что и в описанной выше реализации. Получение экземпляра IHtmlDocument2 из HWND реализовано по примерам, что есть на форуме и не только (в том числе и на мсдн). Буду признателен дельным советам и реализациям кода (как вариант перечисление ссылок на странице по средствам IHtmlDocument2), которые помогут побороть эту проблему. Ниже куски кода по теме: первый - с использованием InternetExplorer.Application Код | program Project1; uses windows, Comobj, ActiveX; const PROCESS_TERMINATE = $0001; var Pid: Cardinal; IE: Variant; ProcessHandle : THandle; {$R *.RES} function IsOLEObjectInstalled(Name: String): boolean; var ClassID: TCLSID; Rez : HRESULT; begin // Ищем CLSID OLE-объекта Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID); if Rez = S_OK then // Объект найден Result := true else Result := false; end;
begin CoInitialize(nil); if not IsOLEObjectInstalled('InternetExplorer.Application') then Exit; IE := CreateOleObject('InternetExplorer.Application'); IE.Navigate(WideString('about:blank'), 0, 0, 0, 0); IE.Visible := True; IE.FullScreen := True; GetWindowThreadProcessId(IE.HWND, @Pid); IE.Navigate(WideString('ya.ru'), 0, 0, 0, 0); while IE.busy do begin Sleep(1); end; //while ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, Pid); TerminateProcess(ProcessHandle,4); CoUninitialize; end.
|
второй - с использованием ShellExecute Код | type TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall; ... //IE windows handles IE_Wnd, //IE big-total-window itself [IEFrame class] IEServ_Wnd, //window where pages are being showed IEStat_Bar, //status bar IEAdr_Bar:HWND ; //address bar (edit control) Doc:IHtmlDocument2; IE: iwebbrowser2; ... procedure GetIE; begin IEAdr_Bar:=0; WHILE IEAdr_Bar=0 DO BEGIN ShellExecute(GetDesktopWindow, pchar('open'), pchar('iexplore.exe'),pchar('about:name'),nil, SW_SHOW); sleep(5000); IE_Wnd:=FindWindow(pchar('IEFrame'), nil); while IE_Wnd<>0 DO begin //wnd for typing [Tab] and [Space] =) IEServ_Wnd:=findwindowex(IE_Wnd, 0, pchar('Shell DocObject View'), 0); IEServ_Wnd:=findwindowex(IEServ_Wnd, 0, pchar('Internet Explorer_Server'), 0); //status bar for quering state =) IEStat_Bar:=findwindowex(IE_Wnd, 0, pchar('msctls_statusbar32'), 0); //address bar for typing http://xyz... WorkerW in 2k/XP, WorkerA in Win98 IEAdr_Bar:=findwindowex(IE_Wnd, 0, pchar('WorkerW'), 0); //if OSVer='WinNT' then IEAdr_Bar:=findwindowex(IE_Wnd, 0, pchar('WorkerW'), 0) // else IEAdr_Bar:=findwindowex(IE_Wnd, 0, pchar('WorkerA'), 0); IEAdr_Bar:=findwindowex(IEAdr_Bar, 0, pchar('ReBarWindow32'), 0); IEAdr_Bar:=findwindowex(IEAdr_Bar, 0, pchar('ComboBoxEx32'), 0); IEAdr_Bar:=findwindowex(IEAdr_Bar, 0, pchar('ComboBox'), 0); IEAdr_Bar:=findwindowex(IEAdr_Bar, 0, pchar('Edit'), 0); if ((IEAdr_Bar<>0)and(GetAdrBarText='about:name')) then break; IE_Wnd:=GetNextWindow(IE_Wnd,GW_HWNDNEXT); end; END; end;
procedure TForm1.GetObject; var hInst: HWND; lRes: Cardinal; MSG: Integer; ObjectFromLresult: TObjectFromLresult; res:HRESULT; begin hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult'); if @ObjectFromLresult <> nil then begin try MSG := RegisterWindowMessage('WM_HTML_GETOBJECT'); SendMessageTimeOut(IEServ_wnd, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes); Res:=ObjectFromLresult(lRes, IHTMLDocument2, 0, Doc); if Res=S_OK then (Doc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE); finally FreeLibrary(hInst); end; end; end;
|
|