我把“利用Delphi编写IE扩展”中的代码编译成功,注册后可是我运行它不起作用请各位高手指点这是为什么?哪里写的不对?附该文:在自己的程序中使用过webbrowser控件的朋友都知道,webbrowser控件定义了诸如beforenavigate、downloadcomplete 等事件,我们可以通过编写事件处理代码实现对webbrowser控件的操作。那么如何实现对ie的事件响应和处理呢?同建立ie面板一样。我们需要建立一个实现iobjectwithsite接口的com组件,不同的是,我们还需要实现idispatch接口,在iobjectwithsite接口的setsite方法中获得ie的webbrowser接口并建立自身与webbrowser的连接,然后如果在ie的webbrowser对象中发生什么事件的话,那么ie就会回调连接的idispatch接口的invoke方法。我们通过在invoke方法中编写代码就可以获得ie事件了。这个利用的是com编程的回调接口原理。下面我们首先来实现代码。点击delphi菜单 file | new 。在 activex 页面中选择active library ,然后点击 ok 按钮。然后用同样的方法建立一个com object。在com object wizard 窗口中,将复选框 included type library 去掉。然后在class name中输入iehelper,在implemented interface 中输入:idispatch;iobjectwithsite 。然后点击 ok 按钮建立一个com组件。保存工程,将工程保存为iehelper.dpr,将unit1保存为iehelperunit.pas。下面是iehelperunit.pas的具体代码:<贴子太长,源码部分付后>代码很长,但是关键的是tiehelper.setsite方法以及tiehelper.invoke方法。在tiehelper.setsite方法中注意以下语句:if assigned(sp)thensp.queryservice(iwebbrowserapp, iwebbrowser2, ie);if assigned(ie) then beginie.queryinterface(iconnectionpointcontainer, cpc);cpc.findconnectionpoint(dwebbrowserevents2, cp);cp.advise(self, cookie)上面的语句作用是,首先获得ie的webbrowser接口,然后寻找到连接点。并通过advise方法建立com自身与连接点的连接。当连接建立成功后,ie在有事件引发后,会调用连接到自身的idispatch接口对象的invoke方法。不同的事件对应不同的dispid编码,我们可以在程序中判断dispid并做相应的处理。在上面的程序中,我们只处理了beforenavigate2 事件,处理函数是dobeforenavigate2,在该函数中,如果浏览的站点不是'http://www.applevb.com/'的话,程序会提示:'你不可以浏览其它站点'并强行转到http://www.applevb.com。很多的软件,象“护花使者”以及“3721”一类的中文网址”都是利用上面的原理来实现对ie浏览器事件响应的,例如3721,当用户输入一个中文词并浏览时,com组件可以在beforenavigate2 事件中编写代码访问服务器并转到正确的站点上去。
解决方案 »
- Delphi新手高手都来指点
- delphi多线程问题
- 关于绘图----这段代码如何改?
- 想重新继承TTreeNode自定义一个带右键菜单的节点
- 尽管UpdateBatch()提示不成功,可事实上后台表中已保存了. 怪事!
- VCL里为什么不把LoadFromFile和LoadFromStream重载成Load?
- ADO缓存的问题,主从表关系.
- 数据流的完全使用手册!希望各位补充!
- delphi7 indy idhttp控件文件续传求助
- 当combobox中的内容超过它的宽度时,我如何在浏览其列表中的内容时,用黄颜色的提示显示其全部内容?
- shellexecute包含在哪个单元里
- 如何在文件里搜索字符串,并将该字符串前的所有byte(包括各种控制符号,如回车,换行符)读入内存?
250:begindobeforenavigate2(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[2]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[3]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[4]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[5]].pvarval)^, dps.rgvarg^[pdispids^[6]].pbool^);result := s_ok;end;251:begindonewwindow2(idispatch(dps.rgvarg^[pdispids^[0]].pdispval^), dps.rgvarg^[pdispids^[1]].pbool^);result := s_ok;end;252:begindonavigatecomplete2(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^);result := s_ok;end;259:begindodocumentcomplete(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^);result := s_ok;end;253:begindoonquit();result := s_ok;end;254:begindoonvisible(dps.rgvarg^[pdispids^[0]].vbool);result := s_ok;end;255:begindoontoolbar(dps.rgvarg^[pdispids^[0]].vbool);result := s_ok;end;256:begindoonmenubar(dps.rgvarg^[pdispids^[0]].vbool);result := s_ok;end;257:begindoonstatusbar(dps.rgvarg^[pdispids^[0]].vbool);result := s_ok;end;258:begindoonfullscreen(dps.rgvarg^[pdispids^[0]].vbool);result := s_ok;end;260:begindoontheatermode(dps.rgvarg^[pdispids^[0]].vbool);result := s_ok;end;end;finallyif (bhasparams) then freemem(pdispids, idispidssize);end;end;function tiehelper.getidsofnames(const iid: tguid; names: pointer;namecount, localeid: integer; dispids: pointer): hresult;beginresult := e_notimpl;end;function tiehelper.gettypeinfo(index, localeid: integer;out typeinfo): hresult;beginresult := e_notimpl;pointer(typeinfo) := nil;end;function tiehelper.gettypeinfocount(out count: integer): hresult;beginresult := e_notimpl;count := 0;end;function tiehelper.getsite(const riid: tiid; out site: iunknown): hresult;begin// result := s_ok;if assigned(ie) then result:=ie.queryinterface(riid, site)elseresult:= e_fail;end;function tiehelper.setsite(const punksite: iunknown): hresult;varcmdtarget: iolecommandtarget;sp: iserviceprovider;cpc: iconnectionpointcontainer;cp: iconnectionpoint;beginif assigned(punksite) then begincmdtarget := punksite as iolecommandtarget;sp := cmdtarget as iserviceprovider;if assigned(sp)thensp.queryservice(iwebbrowserapp, iwebbrowser2, ie);if assigned(ie) then beginie.queryinterface(iconnectionpointcontainer, cpc);cpc.findconnectionpoint(dwebbrowserevents2, cp);cp.advise(self, cookie)end;end;result := s_ok;end;procedure tiehelperfactory.addkeys;var s: string;begins := guidtostring(class_iehelper);with tregistry.create dotryrootkey := hkey_local_machine;if openkey('Software\Microsoft\Windows\CurrentVersion\explorer\Browser Helper Objects\' + s, true)then closekey;finallyfree;end;end;procedure tiehelperfactory.removekeys;var s: string;begins := guidtostring(class_iehelper);with tregistry.create dotryrootkey := hkey_local_machine;deletekey('Software\Microsoft\Windows\CurrentVersion\explorer\Browser Helper Objects\' + s);finallyfree;end;end;procedure tiehelperfactory.updateregistry(register: boolean);begininherited updateregistry(register);if register then addkeys else removekeys;end;initializationtiehelperfactory.create(comserver, tiehelper, class_iehelper,'iehelper', '', cimultiinstance, tmapartment);end.
procedure dobeforenavigate2(const pdisp: idispatch; var url: olevariant; var flags: olevariant; var targetframename: olevariant; var postdata: olevariant; var headers: olevariant; var cancel: wordbool);beginif url<>'http://www.applevb.com/' then beginshowmessage('你不可以浏览其它站点');cancel:=true;url:='http://www.applevb.com';(pdisp as iwebbrowser2).navigate2(url,flags,targetframename,postdata,headers);end;end;
email: [email protected]
这里资料比较全。
我找不到这一项呀?
5。0用BHO有Bug
升级到5。5以上。