好久沒有給VC知識庫發稿了,實在不好意思,由於前段時間實在太忙所以一直沒有時間閑下心來寫點東西,期間也有不少朋友給我來信討論問題,我很感謝大家對我的支援,我歡迎大家繼續來信,共同交流,共同進步!這次我想和大家一起討論一下 Windows 的 Shell 擴充編程,首先在閱讀以下內容之前我還是推薦大家看一下《COM技術內幕》這本大作,不過即使您沒有有關的基礎知識其實也是無所謂的,因為以下講解是傻瓜式講解。
開發環境
Windows Professional 2000
Microsoft Visual C++ 6.0 + ATL3.0
參考文獻
COM技術內幕
ATL應用與開發指南(第二版)
Windows外殼擴充
Windows外殼擴充的英文名稱為:Windows Shell Extension。Windows外殼擴充是一類特殊的COM對象,在這類COM對象中使用者可以加入自己的特殊功能,而Windows外殼擴充最終都會被Windows Explorer所引用。舉個最簡單的例子,比如 WinRar 應用程式,如果你安裝完 WinRar 後,它會在你的右鍵菜單中加入很多捷徑功能表,如 圖1.1 所示:
圖1.1
而上圖卻僅僅是外殼擴充編程中一種:"Context Menu Handler"。難道外殼擴充也分類嗎?是的,但是不多,並且它們的實現大都一致,總體來說有如下幾種分類:
表(一)
處理器類型 |
何時觸發 |
所做處理 |
Context menu 處理器 |
當使用者滑鼠右擊檔案或檔案夾時觸發。但是在Shell V4.71+中,使用者在檔案夾目錄的空白處點擊滑鼠右鍵也會觸發該事件。 |
加入操作功能表項目。 |
Property sheet 處理器 |
當使用者滑鼠右擊檔案,選擇檔案"屬性"菜單彈出檔案屬性對話方塊時觸發。 |
加入使用者自訂屬性頁。 |
Drag and drop 處理器 |
當使用者在檔案夾或案頭中用滑鼠右鍵Drag/Drop檔案或檔案夾時觸發。 |
加入操作功能表項目。 |
Drop處理器 |
當某一資料對象被Drag Over/Dropped Into某一檔案時觸發。 |
加入任何使用者自訂動作。 |
QueryInfo 處理器(Shell V4.71+) |
當使用者滑鼠滑過某一個檔案或某一Shell對象時觸發。 |
加入使用者自訂提示資訊(ToolTips)。 |
也許有人會問我實現它們困難嗎?答案是:比較簡單。實現它是不是必須得去看那些枯燥乏味的ATL模板類,或者生硬死板的 MFC 宏定義呢?答案是否定的。也許以上的問題阻礙了大多數COM初學者的學習慾望,其實我剛接觸ATL時多的是迷惘,常常抱怨 ATL 的知識太深奧,MFC的構架太生硬,一般我是不太喜歡用#define來定義程式的全部(請參閱 effective C++)。言歸正傳,我們再回到今天的話題上來,那麼為實現 圖1.1 所示功能可以通過哪些途徑呢?答案有二,第一:註冊表編程。第二:Shell Extension COM編程。通過註冊表方式實現其實十分簡單,請參閱 COM 組件註冊表實現,在這裡本文不做重複介紹,再者也不是本文的主題所在。在以下的內容中我會以第一類 Shell 擴充編程---" Context Menu 處理器" 為例來講解 Handler 的實現過程。