-
Всем привет! Задача стоит такая: открыть окно MSIE, используя OLE, затем отслеживать когда пользыватель перейдет по какой либо ссылке и произойдет событие OnNewWindow2. Далее необходимо блокировать всплывающее окно и загрузить новую страницу в мой экземпляр браузера. Вот код открывающий экземпляр IE: program msie1; var IE: variant; begin IE := CreateOleObject('InternetExplorer.Application'); IE.Visible:=true; IE.Navigate(' http://blablabla.com', 4); While IE.Busy do begin sleep(100); end; end. Дальше необходимо каким то образом перехватить и обработать событие OnNewWindow2, а как это сделать для меня вопрос... Поиск привел лишь к паре исходников на С без коментариев. :( Есть у кого соображения на этот счет?
-
имхо, проще сымпортить shdocvw.dll и пользоваться классом-оберткой TInternerExplorer. При позднем связывании придется с IConnectionPoint иметь дело
-
> имхо, проще сымпортить shdocvw.dll и пользоваться классом- > оберткой TInternerExplorer. > При позднем связывании придется с IConnectionPoint иметь > дело
Хорошо, я что то видел про этот класс, но так и не разобрался что к чему :( можно небольшой примерчик с TInternerExplorer? И чем так плох IConnectionPoint, как с ним работать???
-
-
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1134
Да, я как раз этот пример и видел, но там рабоа с формой как я понимаю: procedure TMainForm.MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant); begin Memo.Lines.Add(URL); end; А мне нужно в консольном приложении, как это сотворить в из консоли??? Уже который день насилую яндекс, но результат ноль :( ХЭЛП!
-
Пытаюсь заставить работать такой код:
program Project2;
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, OLEauto, Ole2, Controls, Forms, ActiveX, Dialogs, ShDocVw, MSHTML_TLB in '..\..\..\Program Files\Borland\Delphi7\Imports\MSHTML_TLB.pas';
var WB: IWebBrowser2; IE: TInternetExplorer; PointContainer: IConnectionPointContainer;
procedure MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant); begin /// end;
begin CoInitialize(nil); IE:=TInternetExplorer.Create(nil); IE.Visible:=True; IE.OnBeforeNavigate2:=MyBeforeNavigate2; IE.Navigate('d:\Internet\update.htm'); CoUninitialize; end.
Вылазит баг: Incompatible types: 'method pointer and regular procedure'
Что в этом коде не так?
-
> Что в этом коде не так?
type TEventHolder = class public procedure MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant);
end;
var EventHolder: TEventHolder;
begin EventHolder := TEventHolder.Create; IE.BeforeNavigate2 := EventHolder.MyBeforeNavigate2;
-
Вот спасибо! теперь кое что прояснилось!
Но если я пытаюсь обработать таким образом сообщение OnNewWindow2, то получаю ошибку: Incompatible types: 'OleVariant' and 'IDispatch'
type TEventHolder = class public procedure MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant); procedure MyOnNewWindow2 (Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); end;
var WB: IWebBrowser2; IE: TInternetExplorer; PointContainer: IConnectionPointContainer; EventHolder: TEventHolder; ppDisp: IDispatch;
procedure TEventHolder.MyOnNewWindow2 (Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); begin windows.beep(100,100); end;
procedure TEventHolder.MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant); begin windows.beep(100,100); end;
begin CoInitialize(nil); IE:=TInternetExplorer.Create(nil); IE.Visible:=True; EventHolder := TEventHolder.Create; IE.OnNewWindow2:=EventHolder.MyOnNewWindow2; IE.Navigate('c:\1.html'); CoUninitialize; end.
-
> получаю ошибку: Incompatible types: 'OleVariant' and 'IDispatch'
на какой строке?
-
> на какой строке?
IE.OnNewWindow2:=EventHolder.MyOnNewWindow2;
-
а как выглядит сигнатура OnNewWindow2 в tlb?
-
Я не совсем понял,что такое снгнатура?
Вот что удалось найти на эту фу-ию в ShDocVw:
property OnNewWindow2: TInternetExplorerNewWindow2 read FOnNewWindow2 write FOnNewWindow2;
-
> что такое снгнатура?
описание метода. вот это, короче - TInternetExplorerNewWindow2
-
> описание метода. > вот это, короче - TInternetExplorerNewWindow2
Ээ... а как это прикрутить к программе и использовать для перехвата сообщений ???
-
> как это прикрутить
ну вот так и прикрутить IE.OnNewWindow2:=EventHolder.MyOnNewWindow2;
описание TInternetExplorerNewWindow2 как выглядит? типы параметров совпадают с MyOnNewWindow2?
-
Блин, спасибо что навел на путь истенный :) Код вроде как заработал, только вот перехватить событие OnNewWindow2 он всеравно не в состоянии...хоть застрелись :(
program qqq;
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, OLEauto, Ole2, Controls, Forms, ActiveX, Dialogs, ShDocVw, MSHTML_TLB in '..\..\..\..\Program Files\Program Files\Borland\Delphi7\Imports\MSHTML_TLB.pas';
type TEventHolder = class public procedure MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant); procedure MyOnNewWindow2 (Sender: TObject; var ppDisp: OleVariant; var Cancel: OleVariant); end;
var IE: TInternetExplorer; EventHolder: TEventHolder;
procedure TEventHolder.MyOnNewWindow2 (Sender: TObject; var ppDisp: OleVariant; var Cancel: OleVariant); begin ppDisp:=ie.DefaultInterface; end;
procedure TEventHolder.MyBeforeNavigate2(Sender: TObject; var pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel: OleVariant); begin /// end;
begin IE:=TInternetExplorer.Create(nil); IE.Connect; IE.Visible:=True; EventHolder := TEventHolder.Create; IE.onBeforeNavigate2:=EventHolder.MyBeforeNavigate2; IE.onnewwindow2:=EventHolder.Myonnewwindow2; IE.Navigate('c:\1.html'); sleep(10000); end.
Программа открывает окно IE и... в нем ни чего непроисходит, по истечении паузы 10 сек. моя программа закрывается и после этого загружается страница, а программа то с обработчиком уже закрылась и что делать не ясно... Почему так происходит и как все таки обработать onnewwindow2???
-
если нужно отслеживать когда пользыватель перейдет по какой либо ссылке, то далеко не факт, что это произойдет через 10 сек. Значит нужно организовать ожидание, циклом или объектом синхронизации - зависит от дальнейшей логики программы
-
> Значит нужно организовать ожидание, циклом или объектом > синхронизации - зависит от дальнейшей логики программы
Циклом я уже пробывал, пока крутиться цикл, в окно IE страница вообще не загружается, а начинает загружаться только когда моя программа закрывается, чем это вызвано, и что такое объект синхронизации???
Я вот подумал может после вызыва Navigate('c:\1.html'); отсоединиться от IE а потом после загрузки страницы обратно подсоединиться но как??? пробывал так: ..... ie.Navigate('c:\1.html'); IE.Disconnect; //ждем пока загрузиться страница IE.connect; .................. но после этого даже ie.quit; не работает :(
|