Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> InternetExplorer.Application IHtmlDocument2 HWND, IHtmlDocument2 из HWND InternetExplorer 
:(
    Опции темы
alexpotemkin
Дата 6.3.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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;

PM MAIL   Вверх
alexpotemkin
Дата 7.3.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



вылечилось (если кому интересно), код рабочий (исползованы библиотеки кол и собственные резаные, но можно и со стандартными)

Код

program Project1;
uses windows, Comobj, ActiveX, MiniMSHTML, KOLSHDocVw;
const PROCESS_TERMINATE = $0001;
var Pid: Cardinal;
    ProcessHandle : THandle;
    IE: IWebBrowser2;
    Doc: IHtmlDocument2;
    iColl:IHTMLElementCollection;
    iElement:IHTMLElement;
    iDisp:IDispatch;
    temp,ov: OleVariant;
    i: Integer;
    str: String;
{$R *.RES}
function MessageBoxA(hWnd: cardinal; lpText, lpCaption: PAnsiChar; uType: Cardinal): Integer; stdcall; external 'user32.dll' name 'MessageBoxA' index 452;

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') as IWebBrowser2;
  IE.Visible := True;
  GetWindowThreadProcessId(IE.HWND, @Pid);
  IE.Navigate('http://www.ya.ru/', temp, temp, temp, temp);
  while IE.ReadyState <> READYSTATE_COMPLETE do begin
    Sleep(1);
  end;
  Doc := IE.Document as IHtmlDocument2;
  if (Assigned(Doc)) then begin
    ov := 'a';
    IDisp := Doc.all.tags(ov);
    IDisp.QueryInterface(IHTMLElementCollection,iColl);
    for i := 0 to iColl.get_length-1 do begin
      iDisp := iColl.item(i, 0);
      iDisp.QueryInterface(IHTMLElement,iElement);
      str := ielement.getattribute('href',0);
      MessageBoxA(0, PChar(str), PChar('Test'), MB_ICONINFORMATION);
    end;//for
  end;
  ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, Pid);
  TerminateProcess(ProcessHandle,4);
  CoUninitialize;
end.



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.