對於作業系統原理比較瞭解的朋友都會知道,一個完備的作業系統都會提供了一個外殼(shell),以方便普通的使用者使用作業系統提供的各種功能。windows(在這裡指的是windows 95\windows nt4.0以上版本的作業系統)的外殼不但提供了方便美觀的gui圖形介面,而且還提供了強大的外殼擴充功能,大家可能在很多軟體中看到這些外殼擴充了。例如在你的系統中安裝了winzip的話,當你在windows explore中滑鼠右鍵點擊檔案夾或者檔案後,在快顯功能表中就會出現winzip的壓縮菜單。又或者bullet ftp中在windows資源管理員中出現的ftp網站資料夾。windows支援七種類型的外殼擴充(稱為handler),它們相應的作用簡述如下:
(1)context menu handlers:向特定類型的檔案對象增添內容相關性功能表;
(2)drag-and-drop handlers用來支援當使用者對某種類型的檔案對象進行拖放操作時的ole資料轉送;
(3)icon handlers用來向某個檔案對象提供一個特有的表徵圖,也可以給某一類檔案對象指定表徵圖;
(4)property sheet handlers給檔案對象增添屬性頁面(就是右鍵點擊檔案對象或檔案夾對象後,在快顯功能表中選屬性項後出現的對話方塊),屬性頁面可以為同一類檔案對象所共有,也可以給一個檔案對象指定特有的屬性頁面;
(5)copy-hook handlers在檔案夾對象或者印表機對象被拷貝、移動、刪除和重新命名時,就會被系統調用,通過為windows增加copy-hook handlers,可以允許或者禁止其中的某些操作;
(6)drop target handlers在一個對象被拖放到另一個對象上時,就會被系統被調用;
(7)data object handlers在檔案被拖放、拷貝或者粘貼時,就會被系統被調用。
windows的所有外殼擴充都是基於com(component object model) 組件模型的,外殼是通過介面(interface)來訪問對象的。外殼擴充被設計成32位的進程中伺服器程式,並且都是以動態連結程式庫的形式為作業系統提供服務的。因此,如果要對windows 的使用者介面進行擴充的話,則具備寫com對象的一些知識是十分必要的。 由於篇幅所限,在這裡就不介紹com,讀者可以參考微軟的msdn庫或者相關的協助文檔,一個介面可以看做是一個特殊的類,它包含一組函數合過程可以用來操作一個對象。寫好外殼擴充程式後,必須將它們註冊才會生效。所有的外殼擴充都必須在windows註冊表的hkey_classes_root\clsid鍵之下進行註冊。在該鍵下面可以找到許多名字像{0000002f-0000-0000-c000-000000000046}的鍵,這類鍵就是全域唯一類別識別項(guid)。每一個外殼擴充都必須有一個全域唯一類別識別項,windows正是通過此唯一類別識別項來找到外殼延伸模組處理常式的。
在類別識別項之下的inprocserver32子鍵下記錄著外殼擴充動態連結程式庫在系統中的位置。與某種檔案類型關聯的外殼延伸註冊在相應類型的shellex主鍵下。如果所處的windows作業系統為windows nt,則外殼擴充還必須在註冊表中的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ShellExtensions\Approved主鍵下登記。編譯完外殼擴充的dll程式後就可以用windows本身提供的regsvr32.exe來註冊該dll伺服器程式了。如果使用delphi,也可以在run菜單中選擇register activex server來註冊。