很多軟件安裝以後都會在IE浏覽器的工具欄上添加一個自己的啟動按鈕,只要點擊該按鈕就可以啟動自己的程序,比較典型的軟件有網絡螞蟻、金山詞霸、網際快車(FlashGet)等等。如圖1所示,”FlashGet“按鈕就是”網際快車“安裝之後添加的按鈕,這個按鈕能方便用戶啟動程序,而不用從開始菜單中啟動應用程序,節省了很多時間。
這麼好的功能,我們的程序當然也應該有!需要說明的是,IE4.0以下的版本並不支持該功能,直到IE5.0發布,才使該項技術大眾化。那麼怎麼實現這個功能呢?下面讓我們分析一下技術原理。IE啟動的時候,它會去讀取Windows注冊表中相應的數據,如果該鍵值下面有數據並且是正確的,那麼它將正確的顯示出來。如果沒有數據或者有數據但數據是非法的,那麼他將不以理會。所以,實現該功能並不需要復雜的技術,僅僅是處理注冊表而已!
下面我們先看看這些有用的數據到底寫在什麼地方。運行RegEdit程序,打開HKEY_LOCAL_MacHINE SOFTWAREMicrosoftInternet ExplorerExtensions主鍵,並找到{D6E814A0-E0C5-11d4-8D29-0050BA6940E3}子鍵。該子鍵的具體含義我先不作解釋,後文中將詳細介紹。圖2就是FlashGet在IE工具欄上顯示按鈕的奧秘所在其中,是顯示在按鈕上的文字,”FlashGet“就是顯示在IE工具欄按鈕上的文本。
是一個GUID,標明FlashGet的類。
按鈕默認是否可見,我們當然希望按鈕可見了,所以取值為”Yes“.
可執行文件的路徑及其文件名,即當點擊按鈕時,要執行的文件。
顧名思義,就是當鼠標移動在該按鈕上的時候所顯示的圖標,我們應該有這個經驗,就是當鼠標移動到圖標上的時候,圖標的顏色會發生變化,就是這個意思。
就是按鈕所顯示的圖標。當鼠標沒有移動上去的時候將顯示圖標。
是菜單在狀態條的提示。
與按鈕相應的”工具“菜單裡的菜單項名稱。
在動手用VC++來完成這些工作之前,我們先來介紹一些預備知識一、上文中我們曾經提到過GUID.GUID(Globally Unique IDentifIEr),全球唯一標識符,是一個128位的隨機數,是通過計算機的網卡和計算機的時間來共同產生的,所以幾乎不會產生重復數。從理論上講,如果一台機器上每秒產生10,000,000個GUID,那麼也可以保證3240年以上不重復。既然是隨機數,當然就不能保證絕對無重復,但我們已經可以看出,如果要重復的話,那概率是多麼的小!
手工構造這麼一個128的隨機數是相當麻煩的,所以VC++提供了兩個工具來產生GUID.一個是UUIDGen.exe,這是一個命令行程序,所以我並不喜歡。另一個是GUIDGen.exe(如圖3所示,你可以在Visual Studio安裝目錄的CommonTools中找到),該程序是一個基於對話框的程序,用它來產生GUID十分方便,所以我非常愛用它而不用UUIDGen.Exe.
二、VC中的注冊表操作函數主要要用到的注冊表操作函數有RegCreateKeyEx()、RegSetValueEx()和RegOpenKeyEx()等。RegCreateKeyEx()的作用是創建一個鍵值,如果該鍵值存在的話,那麼則打開它。RegSetValueEx()的作用是對某個特定的鍵值進行賦值。RegOpenKeyEx()的作用是打開一個鍵值。具體的函數參數請參考MSDN,這裡就不再贅述了。
下面我們以一個SDI為例演示函數的使用,為了與下文統一起來,請把它建立在”C:Test“.假設我們已經建立一個SDI應用程序Test並給CTestView添加了一個成員函數WriteReg().我們將在該函數中實現在IE浏覽器的工具菜單上和IE的上下文菜單中添加我們的菜單,並實現響應菜單消息。在實現該函數之前,我們先用GUIDGen產生兩個GUID:{32204547-1C47-11d5-A413-00A00CC191CF}和{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}.
該函數的主要內容如下建立上下文菜單, lpSubKey, 0, ”“, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &phkResult,, ”我們自己的上下文菜單(&W)“, REG_SZ, keyValue,建立工具菜單, lpSubKey, 0, ”“, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL,&phkResult,, lpSubKey, 0, KEY_ALL_Access,, ”CLSID“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),, ”MenuText“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),我們自己的測試程序, ”MenuStatusBar“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),, ”Exec“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),工具欄按鈕, ”ButtonText“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),,, ”Icon“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),,, ”HotIcon“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),, ”Default Visible“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),代碼中我們還用到了一個GetAppPath()函數,該函數將返回應用程序的路徑,pathtemp,函數已經寫好了,我們只要在程序適當的地方調用函數WriteReg()就可以了,例如在CTestView::PreCreateWindow()中。現在啟動IE,你會發現IE中有三個地方已經有所不同了,如圖4、圖5、圖6所示試試點擊”MyTest“按鈕或者”工具“菜單上的”MyTest“項看看,我們剛才編寫的MyTest.exe是不是自動執行了?
那麼上下文菜單怎樣執行呢?從我們的程序中可以看出,我們是把它與一個。htm文件”MySelf.htm“相關聯了,即點擊上下文菜單中的”我們自己的上下文菜單“項,IE將會打開MYSelf.htm文件並執行其內容。
現在讓我們回想使用網絡螞蟻的情形:右擊一個文件的URL,選擇”Down by NetAnt“上下文菜單項,IE就會打開網絡螞蟻並開始下載。那麼這個功能是怎麼實現的呢?
如果用過3721網址軟件的話,它也會在IE的上下文菜單中添加自己的菜單”訪問3721網站“,只要點擊該菜單,就會打開浏覽器,進入3721網站,這又是怎麼實現的呢?
其實,兩種功能都是通過那個htm文件來實現的,只是那個htm文件的內容不一樣罷了。下面我們就來揭開這層神秘的面紗。我們先看看3721中文網址,它相對比較簡單。實現點擊上下文菜單並打開一個固定的主頁地址是很簡單的,如果你對Html語言和Script稍有了解的話,閱讀下面MySelf.Htm的代碼就會非常輕松當我們點擊”我們自己的上下文菜單“的時候,IE就會自動打開清華大學的主頁,非常簡單的幾句語句就解決大問題。事實上確實如此,有些問題沒有認清本質的時候我們會覺得它很神奇,我們一旦弄清楚了,就覺得很簡單了,是不是?
下面要講的是怎樣實現網絡螞蟻的功能。不要誤會,我們並不是要實現網絡螞蟻下載的功能,我們只是實現網絡螞蟻的啟動功能,即通過點擊”我們自己的上下文菜單“啟動我們的Test程序而已。如果你對COM一點都不知道的話,最好先去看看這方面的書籍,下面的內容會簡單一些。如果暫時不懂COM的話也沒有關系,我會一步步講的,只要按照我講的步驟操作同樣可以成功。
首先我們建立一個很簡單的COM組件。打開VC++開發環境並新建一個工程AddIEFun,Location選擇”C:AddIEFun“,工程的類型是MFC AppWizard(dll),完畢以後點擊OK按鈕。在”Step 1 of 1“對話框中選中Automation(自動化)選項,因為要讓組件支持腳本訪問的話,必須要實現Automation.其它的接收默認選項。點擊Finish按鈕,新工程就建立好了。
接下來的工作是添加一個COM對象類。雖然我們用AppWizard創建了應用框架,但是還沒有真正的創建COM對象,按照下面的步驟為工程添加一個自動化對象選擇菜單VIEw->ClassWizard打開類向導。
點擊Add Class按鈕,選擇New命令。
在彈出的New Class對話框的Name中輸入類名CIEcontext,在Base class選擇框中我們選擇CCmdTarget,在對話框的下部我們選中Creatable by type ID,如圖7所示。最後單擊”OK“按鈕,這樣CIEcontext創建完成了,並且在類CIEcontext中實現了IIEcontext接口。
下面我們要做的就是添加一個方法真正來實現這個接口,讓它來完成打開Test.exe的功能,步驟如下打開ClassWizard.
選中Automation選項頁。
在Class name字段中選中CIEcontext.
單擊Add Methord按鈕,彈出Add Methord對話框。
在External Name中輸入AddContext,選擇Return type類型為void,因為我們不需要返回什麼特別的值,也不需要參數,所以在參數列表中也不需要添加參數。
單擊”OK“按鈕,關閉Add Methord對話框。
關鍵的一步就是要實現AddContext方法。因為我們要在腳本中訪問該方法,而且只訪問該方法就可以了,所以要添加的代碼極其簡單--只有一句代碼,就是打開我們的程序Test.Exe,代碼如下,現在對這個方法進行一些說明。該方法調用了WinExec()函數,目的是運行我們自己的程序。可以看出,該API有兩個參數:一個是程序的完整路徑和文件名,另一個參數是打開程序的方式。不過要說明一點,以這種絕對路徑打開程序的方式不是很科學,實際應用中,事先應該把程序的路徑寫入注冊表,然後在程序中讀取注冊表中的信息。
我們的一個支持自動化的COM組件已經建成了,就這麼簡單。編譯通過後,你會發現在工程的Debug目錄下會產生兩個特別的文件:AddIeFun.dll和AddIEFun.tlb,它們就是編譯後產生的庫文件。不過,要讓用戶能在程序中使用它們,首先必須對該組件進行注冊。直接運行RegSvr32.Exe雖然簡單,但是在VC++的集成環境中點擊Tools菜單的Register Control更方便。注冊成功的話,會彈出一個消息框,如圖8所示現在,我們大部分任務已經完成了,剩下就是修改MySelf.htm文件,代碼如下錯誤好了,現在你可以放心大膽的使用你的程序了!