![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112317410817.jpg)
圖
()將工程和單元文件依次保存為DIEMonitordpr和UIEMonitorpas切換到UIEMonitorpas單元文件編輯TIEMonitor的定義形式如下:
TIEMonitor = class(TComObject IDispatch IObjectWithSite)
public
function GetTypeInfoCount(out Count:Integer):HResult;stdcall;
function GetTypeInfo(IndexLocaleID:Integer;out TypeInfo):HResult;stdcall;
function GetIDsOfNames(const IID:TGUID;Names:Pointer;NameCountLocaleID:Integer;DispIDs:Pointer):HResult;stdcall;
function SetSite(const pUnkSite:IUnknown):HResult;stdcall;
function GetSite(const riid:TIID;out site:IUnknown):HResult;stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult ExcepInfo ArgErr: Pointer): HResult; stdcall;
private
IEThis:IWebBrowser;
Cookie:Integer;
protected
end;
注意在UIEMonitorpas單元文件的Uses中需要手動加入對SHDOCVW Dialogs SysUtils Forms的引用
其中主要是對IObjectWithSite接口的SetSite()方法和IDispatch接口的Invoke()方法的實現:首先通過SetSite()方法獲得IE的WebBrowser接口然後尋找連接點並且通過調用Advise()方法建立COM自身與連接點的連接當連接建立成功後IE在事件引發後會調用連接到自身的IDispatch接口對象的Invoke方法不同的事件對應不同的DispID編碼因此可以通過在程序中判斷DispID對不同的事件做出相應的處理系統主要對BeforeNavigateDownLoadComplete和OnQuit三個事件進行處理它們對應的DispID分別為和在Invoke()方法中根據DispID分別調用DoBeforeNavigate()DoDownLoadComplete()和DoOnQuit()函數實現相關處理和控制功能
()編譯工程生成DIEMonitordll文件
注冊/卸載COM對象
注冊COM對象包括注冊COM對象以及將COM對象的有關信息寫入到IE浏覽器擴展功能指定的注冊表位置下面分別對其注冊方法進行介紹卸載方法分別和注冊方法相對應
()注冊/卸載COM對象一種方法是在Delphi開發環境下運行Run|Register ActiveX Server/Run|Unregister ActiveX Server自動完成COM對象的注冊/卸載;另一種方法是通過調用MS Windows操作系統提供的regsvrexe命令進行注冊
() 注冊/卸載COM對象的有關信息到IE浏覽器擴展功能指定的注冊表位置將COM對象的CLSID寫入到IE浏覽器擴展功能指定的注冊表位置後當IE浏覽器啟動時就通過該CLSID查找COM對象有關信息(如文件路徑)從而實現了COM對象嵌入式功能擴展為了實現這個目的只需要在注冊表的[HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\CurrentVersion\Explorer\Browser Helper Objects]項下建立一個名稱為COM對象的CLSID的注冊表項目即可
[] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/24885.html