程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 利用Delphi編寫IE擴展(3)

利用Delphi編寫IE擴展(3)

編輯:Delphi

 


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(SoftwareMicrosoftWindowsCurrentVersionexplorerBrowser 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(SoftwareMicrosoftWindowsCurrentVersionexplorerBrowser 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 事件中編寫代碼訪問服務器並轉到正確的站點上去。
   

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved