转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
利用DELPHI编写IE扩展         ★★★★

利用DELPHI编写IE扩展

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1845 更新时间:2009/4/23 18:25:44
p;    254:
        begin
          DoOnVisible(dps.rgvarg^[pDispIds^[0]].vbool);
          Result := S_OK;
        end;
      255:
        begin
          DoOnToolBar(dps.rgvarg^[pDispIds^[0]].vbool);
          Result := S_OK;
        end;
      256:
        begin
          DoOnMenuBar(dps.rgvarg^[pDispIds^[0]].vbool);
          Result := S_OK;
        end;
      257:
        begin
          DoOnStatusBar(dps.rgvarg^[pDispIds^[0]].vbool);
          Result := S_OK;
        end;
      258:
        begin
          DoOnFullScreen(dps.rgvarg^[pDispIds^[0]].vbool);
          Result := S_OK;
        end;
      260:
        begin
          DoOnTheaterMode(dps.rgvarg^[pDispIds^[0]].vbool);
          Result := S_OK;
        end;
    end;
  finally
    if (bHasParams) then FreeMem(pDispIds, iDispIdsSize);
  end;
end;


function TIEHelper.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
  Result := E_NOTIMPL;
end;

function TIEHelper.GetTypeInfo(Index, LocaleID: Integer;
  out TypeInfo): HResult;
begin
  Result := E_NOTIMPL;
  pointer(TypeInfo) := nil;
end;

function TIEHelper.GetTypeInfoCount(out Count: Integer): HResult;
begin
  Result := 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)
   else
     Result:= E_FAIL;
end;

function TIEHelper.SetSite(const pUnkSite: IUnknown): HResult;
var
  cmdTarget: IOleCommandTarget;
  Sp: IServiceProvider;
  CPC: IConnectionPointContainer;
  CP: ICOnnectionPoint;
begin
  if Assigned(pUnkSite) then begin
    cmdTarget := pUnkSite as IOleCommandTarget;
    Sp := CmdTarget as IServiceProvider;

      if Assigned(Sp)then
        Sp.QueryService(IWebbrowserApp, IWebbrowser2, IE);
      if Assigned(IE) then begin
        IE.QueryInterface(IConnectionPointContainer, CPC);
        CPC.FindConnectionPoint(DWEBbrowserEvents2, CP);
        CP.Advise(Self, Cookie)
      end;
  end;
  Result := S_OK;
end;


procedure TIEHelperFactory.AddKeys;
var S: string;
begin
  S := GUIDToString(CLASS_IEHelper);
  with TRegistry.Create do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    if OpenKey('Software\Microsoft\Windows\CurrentVersion\explorer\Browser Helper Objects\' + S, TRUE)
      then CloseKey;
  finally
    free;
  end;
end;

procedure TIEHelperFactory.RemoveKeys;
var S: string;
begin
  S := GUIDToString(CLASS_IEHelper);
  with TRegistry.Create do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    DeleteKey('Software\Microsoft\Windows\CurrentVersion\explorer\Browser Helper Objects\' + S);
  finally
    free;
  end;
end;

procedure TIEHelperFactory.UpdateRegistry(Register: Boolean);
begin
  inherited UpdateRegistry(Register);
  if Register then AddKeys else RemoveKeys;
end;

initialization
  TIEHelperFactory.Create(ComServer, TIEHelper, Class_IEHelper,
    'IEHelper', '', ciMultiInstance, tmApartment);
end.

    代码很长,但是关键的是TIEHelper.SetSite方法以及TIEHelper.Invoke方法。在TIEHelper.SetSite方法中注意以下语句:
      if Assigned(Sp)then
        Sp.QueryService(IWebbrowserApp, IWebbrowser2, IE);
      if Assigned(IE) then begin
        IE.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 事件中编写代码访问服务器并转到正确的站点上去。
    以上程序在Win2K、Delphi 5下编写 Win98、Win2K下编辑通过.

上一页  [1] [2] 


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台