一個操作系統外殼的不錯的定義是它是一個系統提供的用戶界面,它允許用戶執行公共的任務,如訪問文件系統,導出執行程序,改變系統設置等。MS-DOS有一個Command.COM扮演著這個角色。然而Windows已經有了圖形界面環境,他的外殼程序也就必然是圖形方式的。在Windows95以前,默認的Windows Shell就是程序管理器。
?????????程序管理器是一個中央控制臺,從那里你可以啟動應用程序,重排和重組圖標,執行新任務。換句話說,程序管理器就像他的名字提示的那樣管理所有集中在Windows大傘之下的程序。現在對應程序管理器的是文件管理器,它是一個專門為維護文件系統而設計的工具。
?????????隨著Windows95的出現,探測器取代了這兩個老工具,并集成了二者的功能,如果你愿意,你仍能發現文件管理器仍然深深地隱藏在Windows系統目錄中。然而,由于用戶友善性方面比他的后繼者差,現今已經很少使用了。
?????????一般錯誤的概念認為,探測器就是一個程序,當你需要通過點擊“我的計算機”或右擊“開始”按鈕來瀏覽文件系統時這個程序啟動。事實上,探測器總是啟動和運行著的,從引導開始一直到你關閉計算機。直覺是“探測器”實際上就是新概念下的窗口。探測器是一個可執行模塊(explorer.exe),它實現了Windows外殼功能。
?????????在這一章中,主要是介紹外殼和探測器,更精確地講是
???????????????????Shell的組成部分
???????????????????探測器結構
?
Shell的組成部分
Shell由許多不同的部分組成,現在我們就從最顯而易見的桌面和任務條開始。從概念上講,桌面是所有Windows Shell對象的父對象,即宿主對象。就實現方式而言,桌面是一個系統定義窗口類的特殊窗口(命名為#32769),并且是所有窗口的祖先窗口。那些導出應用的頂層窗口一般而言都是桌面的子窗口。在這些子窗口中有一個有趣的窗口子樹,它的根是“程序管理器”。
?????????你可以用CV++帶的工具Spy++來檢查窗口棧中打開的窗口。
??????
程序管理器保持了兼容性,在圖中你可以看到,他的封裝結構:程序管理器的直接下級是一個命為SHELLDLL DefView的窗口類,這個窗口包含了一個默認的觀察對象,事實上這個窗口負責枚舉標準文件夾的內容,它總是從ListView控件中導出,這是一個通用的系統控件。SHELLDLL DefView窗口包含了一個ListView(類名為SysListView32)和一個標題控件(類名為SysHeader32),標題控件僅僅用于ListView的報告觀察。
?????????隨著IE4.0的活動桌面和Windows98的發布,默認的觀察對象已經有了基于某些瀏覽器能力的變化。在下一章中我們將更進一步討論這些觀察對象和他們的變化。
?
程序管理器
就象前面提到的一樣,程序管理器窗口是為了兼容性而保留的。它正好演示了一個窗口應用從16位到32位的演變過程。在Win16環境中,與Shell唯一的通訊方式是通過動態數據交換(DDE)。這個層面的代碼在Windows95?甚至Windows98?中還在維護。為什么呢?,為了兼容性。
?????????關于DDE接口變成與Shell的詳細說明,建議察看資料Internet ClientSDK其中給出了最新的信息。DDE是一款較老的技術,微軟已經有大量的資料說明。
?
任務條
主要的Windows Shell部件就是任務條,它實際上就是由探測器進程所擁有的一個窗口。每當你需要終止探測器進程的時候,都將引起任務條的消失和重新顯現。每當他重新顯現的時候他注冊一個具有不同HWND的新窗口。因而,就引用而言,你沒有必要保留這個窗口的HWND?。任務條也是也各擁有“開始”按鈕的窗口,在托盤區域有時鐘和類似按鈕的控件,表示正在運行的應用。
?????????任務條實際上與窗口一樣,可以在其上作任何窗口上可以做的操作如移動、隱藏和子類化等。在第七章中我們將說明怎樣子類化任務條和“開始”按鈕。在第九章中可以找到怎樣隱藏任務條和編成重新啟動Shell。這后一個特性在編成實現Shell和命名空間擴展時是有用的。
?
桌面
你是否奇怪,桌面上的快捷方式是從哪里來的和屬于誰,坦白地講,開始我也認為探測器模塊繪制了這些圖標,記錄了用戶設置,顏色,狀態等。這個模塊開可能在桌面背景上繪制用戶設置的墻紙。
?????????桌面并不是這樣工作的,相反,快捷方式作為圖標是由一個普通的ListView顯示的。當然這個ListView有了一個不尋常的變異,但是它確實是一個ListView,因此它也就不難從消息中獲取處理對象了,將在第九章中給出例程進行說明。
?
探測器結構
?????????探測器是一個扮演著系統外殼角色的應用程序。當說到外殼擴展的時候,我們講的就是有探測器感知的、裝入的并最終執行的代碼塊。
?????????探測器可以被看作為一個微型的窗口開發環境。想象一下:它有自己的函數和對話框;允許寫特殊的與已存在的體系集成的應用程序;能包容應用和文檔。他甚至可以解釋任何活動的腳本兼容語言的腳本(VBScript,JScript,Perl,等等)。本書中將包含所有這些特征。
?
擴展的切入點
隨Windows3.1一起發布的文件管理器有著非常好的旦未充分利用的特性,比如:它能夠在運行時加載DLL,執行具有特殊原形的已注冊函數等。也就是說,在這個資源中有一點,其代碼本身能夠知曉某些活動是由用戶執行的。換句話說,文件管理器支持擴展行為,當執行特定的活動時,查找注冊的擴展并裝載和運行之。
?????????我們后面在探測器外殼和命名空間擴展中見到的實際上有相同的原理。不同的完全是細節方面的實現。文件管理器用于加載具有預定義原形的傳統的DLL全程函數,而探測器是這一過程更加規范。尤其是它采用COM接口(可以看作預定義和固定函數原型的集合)和進程內服務器(實質上的DLL)
當然,COM接口和進程內服務器比函數集和DLL更復雜,但是,這也使探測器進程比老的基于DLL的進程更規范和有力。
?
對探測器的擴展
?????????在探測器環境中,基本上有兩種類型的擴展:外殼擴展和命名空間擴展。從名字上看有點混淆,探測器就是Windows的外殼,所以兩種類型的擴展都可以作為外殼擴展。換句話說,外殼和命名空間擴展二者都擴展了探測器能力。但是在他們之間有一些差別。
?????????外殼擴展是一種加到給定類型的所有文件上的客戶行為,給定類型的文件按照客戶要求顯示在探測器的觀察中。如此,你可以稱之為“外殼觀察的擴展”。客戶的行為,如拖拽,右擊關聯菜單,繪制圖標或顯示屬性對話框等由一定數量的特殊事件觸發。你可以定義這些事件的特殊處理器程序,例如你可以確定顯示給定.Bmp文件的圖標,為所有Windows?元文件加一個預覽頁面到屬性對話框,甚至可以在關聯菜單中增加一個可執行功能。將在十五章中給出例程。
?????????命名空間擴展有兩種形式,這要看你怎樣連接。如果你用文件類型連接命名空間擴展,盡管有復雜的代碼支持,其功能上仍然等價于關聯菜單的擴展。然而,如果你用文件夾連接命名空間擴展,這個文件夾將變成客戶文件夾,你的代碼將確定文件夾的內容、探測器顯示的圖標、子文件夾、排序、關聯菜單等。
?
為什么要對Shell編成
這個問題很有道理,簡單的回答就是,為了使我們的應用根號和更豐滿。但是這個回答有點過于辭令化,我們這樣做是為了使我們的模塊與系統集成到一起,或者說更自動化。
?
本書的結構
?????????有兩種方法對外殼編程,使用API函數和使用COM接口。這兩種方法既不互相獨立也不相互重疊,它們是兩個不同的方向和兩種不同領域,這一點我們在下一章中將進一步闡述。現在讓我們直接瀏覽一下個章節的內容。
?????????你知道Shell編程要求使用API函數和COM接口,API函數使你能夠訪問Shell的基本功能,如,文件操作,瀏覽文件夾,執行程序,處理圖標和快捷方式等。當你想要增強和精煉Shell的基本行為時,COM方法則觸及到了客戶化Shell擴展的核心。
?????????這本書中首先給出所有API函數的解釋,進一步探討函數的原型,資料介紹的差別以及其中的Bugs。通常我的目的是要澄清所有你在資料中遇到的含混之處。第三章到第九章涉及到特殊的APIs分組,其中包含了典型的Shell操作,特別在第三章中講解SHFileOperation()函數,涉及到文件的拷貝、移動、刪除和重命名操作。第四章揭示了神秘的SHGetFileInfo()函數,系統提供了獲取文件(屬性、圖標、類型和顯示名)的系統信息和Shell信息的方法。第五章解釋文件夾內部組織的疊放過程,包括設置、瀏覽和象Favorites和SendTo那樣的特殊文件夾。
快捷方式和屬性在第六章中介紹,其中將介紹建立和解析快捷方式和經常使用的字段。第七章則正式進入探測器地址空間,并且從另一個角度討論客戶化問題:在探測器不可知的情況下什么是你所能安全操作的。特別是我們向你展示一個置換過的“開始”按鈕和不同的菜單。一旦你這樣做過之后,你就有了完全控制Windows系統的能力了。在余下的第八和第九章中我們將講述程序的擴張,圖標和任務條,我們將說明怎樣編程加入新的具有自己的菜單的按鈕到任務條中。
這本書的第二部分是基于要求COM接口的探測器特征的。但是直到第十二章之前我們還沒有涉及到接口知識,中間的兩章作為Shell函數和探測器接口的橋梁。第十章包含了最近更新的Windows的SDK函數。第十一章給出了Shell對象的概覽,例如“我的公文包”,“控制面板”和“打印機”,以及客戶文件夾的概念。在這一章中還包括了其他Shell對象和RunDLL32使用程序的說明以及全部探測器命令行的解釋。
第十二章介紹Shell對象模型,首先致力于把API函數的一個子集移動到對應的COM接口中去,這個特性最少要求系統中要安裝“活動桌面”。有趣的是這個對象模型允許你訪問系統的某些功能(絕大多數系統對話框)。
第十三章介紹Windows腳本環境,這是一個執行Windows批處理文件的運行時引擎。技術上講,這并不是一個Shell實體,但是它與Shell有重要的留級關系。Windows腳本環境顯露一個對象模型,使你能夠使用VBScript,Jscript等任何腳本語言編寫程序。我將通過加入有用的新對象來擴展這個模型。
第十四章集中于指導你采用Shell和命名空間擴展的應用和理由方面。我將揭示實際上的Shell集成的應用究竟是什么和為什么說Shell擴展是把應用模塊與系統Shell融合的最好方法。第十五章說明怎樣寫一個Shell擴展來客戶化關聯菜單、圖標和屬性,以及怎樣排錯。第十六章概括了命名空間擴展內容,并且包含一個例子,說明怎樣加一個可展開節點到探測器的樹觀察中,并以文件夾的形式展示了當前窗口的堆棧過程。
?
小結
???????這一章中我們描繪了未來各章中打算作的事情,尤其是我們試圖解釋:
??????????????Shell的本質和結構
??????????????各Shell版本之間的差異