http://www.csdn.net/develop/Read_Article.asp?Id=6351
利用Delphi编写IE扩展
=========================
我就照这么做了....注册后...
1.怎么打开"我的电脑"都不行....为什么呢?
2.Ie在这里是个COM服务器还是Delphi写的才是服务器?
3.COM的事件触发是靠连接点..好像它就是这么做的..可我还是比较模糊..procedure DoBeforeNavigate2(const pDisp: IDispatch; var URL: OleVariant; var Flags: OleVariant; var TargetFrameName: OleVariant; var PostData: OleVariant; var Headers: OleVariant; var Cancel: WordBool);
begin 
  if URL<>'http://www.applevb.com/' then
  begin
    Showmessage('你不可以浏览其它站点');
    Cancel:=True;
    URL:='http://www.applevb.com';
    (pDisp as IWebbrowser2).Navigate2(URL,Flags,TargetFrameName,PostData,Headers);
  end;
end;procedure BuildPositionalDispIds(pDispIds: PDispIdList; const dps: TDispParams);
var
  i: integer;
begin
  Assert(pDispIds <> nil);
  for i:=0 to dps.cArgs - 1 do
    pDispIds^[i] := dps.cArgs -1 - i;
    if (dps.cNamedArgs <= 0) then Exit;
      for i := 0 to dps.cNamedArgs - 1 do
        pDispIds^[dps.rgdispidNamedArgs^[i]]:= i;
end;
//========================================================================
{ TIEHelper }function TIEHelper.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
  Result := E_NOTIMPL;
end;function TIEHelper.GetSite(const riid: TIID;
  out site: IInterface): HResult;
begin
  if Assigned(IE) then result := IE.QueryInterface(riid, site)
  else
    Result:= E_FAIL;
end;//***************************
function TIEHelper.SetSite(const pUnkSite: IInterface): 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;
function TIEHelper.Invoke(DispID: Integer; const IID: TGUID;
  LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
  ArgErr: Pointer): HResult;
type
  POleVariant = ^OleVariant;
var
  dps: TDispParams absolute Params;
  bHasParams: boolean;
  pDispIds: PDispIdList;
  iDispIdsSize: integer;
begin
  Result := DISP_E_MEMBERNOTFOUND;
  pDispIds := nil;
  iDispIdsSize := 0;
  bHasParams := (dps.cArgs > 0);
  if (bHasParams) then
  begin
    iDispIdsSize := dps.cArgs * SizeOf(TDispId);
    GetMem(pDispIds, iDispIdsSize);
  end;
  try
    if (bHasParams) then BuildPositionalDispIds(pDispIds, dps);
    case DispId of
    102:
    begin
      DoStatusTextChange(dps.rgvarg^[pDispIds^[0]].bstrval);
      Result := S_OK;
    end;
    108:
    begin
      DoProgressChange(dps.rgvarg^[pDispIds^[0]].lval, dps.rgvarg^[pDispIds^[1]].lval);
      Result := S_OK;
    end;
    105:
    begin
      DoCommandStateChange(dps.rgvarg^[pDispIds^[0]].lval, dps.rgvarg^[pDispIds^[1]].vbool);
      Result := S_OK;
    end;
    106:
    begin
      DoDownloadBegin();
      Result := S_OK;
    end;
    104:
    begin
      DoDownloadComplete();
      Result := S_OK;
    end;
    113:
    begin
      DoTitleChange(dps.rgvarg^[pDispIds^[0]].bstrval);
      Result := S_OK;
    end;
    112:
    begin
      DoPropertyChange(dps.rgvarg^[pDispIds^[0]].bstrval);
      Result := S_OK;
    end;
    250:
    begin
      DoBeforeNavigate2(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:
    begin
      DoNewWindow2(IDispatch(dps.rgvarg^[pDispIds^[0]].pdispval^), dps.rgvarg^[pDispIds^[1]].pbool^);
      Result := S_OK;
    end;
    252:
    begin
      DoNavigateComplete2(IDispatch(dps.rgvarg^[pDispIds^[0]].dispval), POleVariant(dps.rgvarg^[pDispIds^[1]].pvarval)^);
      Result := S_OK;
    end;
    259:
    begin
      DoDocumentComplete(IDispatch(dps.rgvarg^[pDispIds^[0]].dispval), POleVariant(dps.rgvarg^[pDispIds^[1]].pvarval)^);
      Result := S_OK;
    end;
    253:
    begin
      DoOnQuit();
      Result := S_OK;
    end;
    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;=============
主要是这几个...大家能不能详细讨论一下.......谢谢~~