|
首先,我要说下,lazarus有个包叫lazActiveX,自带一个控件,据群友说,感觉不错,我也没仔细看,我使用另一种方法。我的环境是Codetyphon。
1.lazarus的ide中,“工具”菜单---Import Type Library;导入一个ActiveX控件,网上有教程,最后反正是为了得到xxx_TLB.pas;我导入的是WebBrowser,最终得到SHDocVw_1_1_TLB.pas;
2.在单元内引用ActiveX和SHDocVw_1_1_TLB,当然,你得把SHDocVw_1_1_TLB导入进工程;
3.xxx:=CreateOleObject('InternetExplorer.Application'); windows.SetParent(xxx.HWND,Form1.Handle);
这两句,你懂得,对吧?
4.最主要的是挂载回调函数,首先,引用我提供的“eventsink.pas”(我大多抄的别人的,有点小问题,修改了下。)
私有域申明“EventSink : TEventSink;”
EventSink := TEventSink.Create(Self);
EventSink.OnInvoke := @EventSinkInvoke;
EventSink.Connect(xxx, DWebBrowserEvents2);
EventSinkInvoke这个函数原型为
procedure EventSinkInvoke(Sender: TObject; DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word;
Params: tagDISPPARAMS; VarResult, ExcepInfo, ArgErr: Pointer);
DWebBrowserEvents2接口在SHDocVw_1_1_TLB中,浏览的接口是IWebBrowser2,事件的接口是DWebBrowserEvents2,至于为什么,说来话长,反正就是还有个1,是老版本,这个是新的,区分事件的,是那个命名习惯,这东西得讲微软的历史,我就不讲了。
但是我们必须打开SHDocVw_1_1_TLB,找到DWebBrowserEvents2,然后看你想挂那个事件,DWebBrowserEvents2里面包含所有的事件,注意dispid,我准备截获NewWindow2,他的是251;
5.实现EventSinkInvoke函数,
case dispid of
251:自己实现的回调函数,类型当然和SHDocVw_1_1_TLB中的那个要一样了,前面那个251,你肯定还没忘,对吧
end;
这里我啰嗦一句,我看的教程上说,Params是顺序放参数的,但是我在lazarus上发现,是反序的,至于为什么,我也不知道。有知道的兄弟,可以来拍砖。要是没说清楚,你自己看代码吧。
我在一个其他兄弟的代码上改的,你可以这样认为,代码风格写的好的,是我写的,不好的,都是他写。。。。。。。
[url=]mylazaruswebbrowser.rar[/url] |
评分
-
查看全部评分
|