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