[轉]第一章 Windows Shell是什么 【來源:http://blog.csdn.net/wangqiulin123456/article/details/7987862】...

一個操作系統外殼的不錯的定義是它是一個系統提供的用戶界面,它允許用戶執行公共的任務,如訪問文件系統,導出執行程序,改變系統設置等。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版本之間的差異

轉載于:https://www.cnblogs.com/songtzu/p/3239815.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259521.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259521.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259521.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

20155222盧梓杰 《Java程序設計》第1周學習總結

20155222 《Java程序設計》第1周學習總結 教材學習內容總結 JDK是一個工具程序,包括了JAVA程序語言,工具程序與JRE,JRE包括了部署技術,JAVA SE API 與 JVM。 教材學習中的問題和解決過程 第一章:JDK的變量和選項如何設…

字符串常量與字符串變量

參考:http://blog.csdn.net/chenwenshi/article/details/6702576 定義:在一個雙引號“ ”內的字符序列或者轉義字符序列稱為字符串常量 例如:“HI HI!” “a” “\n\t” 這些字符串常量是不能改變的,如果試圖改變指針…

java資源分配算法,java - 資源分配與動態規劃算法 - 堆棧內存溢出

給定一組函數f1 ... fn(離散時間)和時間限制(int),應找到最大輸出,即在不同函數之間分配時間以最大化所用函數輸出的總和。對于任何函數,任何時候的值表示如果用于所述時間的函數的總輸出。 即F(2)函數的總輸出,如果使用2秒。 不是…

Factorial Trailing Zeroes 172

題目描述: 給出一個integer n,計算n!結尾0的個數 題目分析: 考慮暴力,計算n!統計最后面0的個數。先不說數字溢出,其次n是一個integer ,O(n)復雜度超時 我們接著考慮,產生…

DateTime.Now.ToString() 用法

//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString("d"); //2008年4月24日 16:30:15 System.DateTime.Now.ToString("F"); //2008年4月24日 16:30 System.DateTime.No…

GAP平臺

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/u/2441327/blog/846754

二進制與十進制的轉換

本文參考:http://www.360doc.com/content/11/0308/14/5327079_99222581.shtml文獻整理所得。 1.正整數的十進制轉換為二進制. 十進制整數轉換為二進制整數采用"除2取余,逆序排列"法。具體做法是:用2整除十進制整數,可以得到一個商…

php記錄已經點擊過,最近一次的PHP面試題記錄,office已到手!

1、explain 具體哪些等級具體有 system、const、range、index、all2、MySQL 優化避免全表查詢,首先應考慮在 where 及 order by 涉及的列上建立索引應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描 (可以將字…

原生Ajax講解

典型的http通信:瀏覽器向服務器發出請求,服務器向客戶端返回響應,瀏覽器重新加載頁面,這種不連續的頁面加載方式導致用戶的體驗變得雜亂,缺乏連貫性。 如: 在一般的web應用程序中,用戶填寫表單字…

16、Python與設計模式--模板模式

一、股票查詢客戶端 投資股票是種常見的理財方式,我國股民越來越多,實時查詢股票的需求也越來越大。今天,我們通過一個簡單的股票查詢客戶端來認識一種簡單的設計模式:模板模式。根據股票代碼來查詢股價分為如下幾個步驟&#xff…

避免濫用子選擇器

CSS的選擇符是有權重的,當不同選擇符的樣式設置有沖突時,會采用權重高的選擇符設置的樣式。 如果CSS選擇符權重相同,那么樣式會遵循就近原則,哪個選擇符最后定義,就采用哪個選擇符的樣式。 如果忽略了CSS選擇符權重&am…

C++中的空類,默認產生哪些類成員函數?

class Empty { public:/*Empty();//默認構造函數Empty(const Empty& rhs);//拷貝構造函數~Empty();//析構函數Empty& operator(const Empty& rhs);//賦值函數Empty* operator&();//取地址運算符const Empty* operator&() const;//取址運算符 const */ prot…

php exist echo,PHP函數file_exists介紹

&#xfeff;定義和用法file_exists() 函數檢查文件或目錄是否存在。如果指定的文件或目錄存在則返回 true&#xff0c;否則返回 false。exists中文翻譯為存在的意思。語法file_exists(path)例子Example #1<?phpecho file_exists("test.txt");?>輸出&#x…

閉包應用之延遲函數setTimeout

根據HTML 5標準&#xff0c;setTimeout推遲執行的時間&#xff0c;最少是5毫秒。如果小于這個值&#xff0c;會被自動增加到5ms。 每一個setTimeout在執行時&#xff0c;會返回一個唯一ID&#xff0c;把該ID保存在一個變量中&#xff0c;并傳入clearTimeout&#xff0c;可以清除…

并行編程2——多核體系架構

1.1 多核處理器定義 多內核處理器架構是指&#xff1a;芯片設計工程師在單個處理器中集成兩個或多個 “執行內核&#xff08;即計算引擎&#xff09;”。多內核處理器可直接插入到單一處理器基座中。但是&#xff0c;操作系統會把它的每個執行內核作為獨立的邏輯處理器&#x…

21:蘋果和蟲子2

團隊QQ&#xff1a;466373640個人博客&#xff1a;www.doubleq.winc/noi/信息學奧數博客&#xff1a;http://www.cnblogs.com/zwfymqz 1:蘋果和蟲子2 查看提交統計提問總時間限制:1000ms內存限制:65536kB描述你買了一箱n個蘋果&#xff0c;很不幸的是買完時箱子里混進了一條蟲子…

php運行代碼運行退出為0,php – Selenium測試用例返回進程以退出代碼0結束

你使用“phpunit yourTestCase.php”而不是“php yourTestCase.php”嗎&#xff1f;我使用phpunit(3.5.14)和“selenium-server-standalone-2.0rc2.jar”運行你的testfile,沒有問題(除了測試本身失敗)&#xff1a;PHPUnit 3.5.14 by Sebastian Bergmann.ETime: 10 seconds, Mem…

Xcode6中使用initWithTitle:title image:image selectedImage:自定義圖片

使用xcode6來運行項目&#xff0c;發現使用原生的tabbar上的圖片不顯示了。這個問題是因為xcode6中的一些api方法被廢棄了,同時tabbar上圖片的渲染方式發生了改變。先看xcode6中的tabbar api方法的變更&#xff1a;- (void)setFinishedSelectedImage:(UIImage *)selectedImage …

[Node.js]get/post請求

摘要 在很多情況下&#xff0c;我們的web服務器都需要接受客戶端瀏覽器傳遞的參數或者數據。最常見的是get和post請求。 獲取get請求的內容 get請求傳遞的參數在url中&#xff0c;參數部分在?后面。因此可以手動解析后面的內容作為get請求的參數。node.js中url模塊中的parse函…

MyEclipse10 Tomcat7 JDK1.7 配置

第一步.MyEclipse10 Tomcat7 JDK1.7下載 MyEclipse10http://downloads.myeclipseide.com/downloads/products/eworkbench/indigo/installers/myeclipse-10.0-offline-installer-windows.exe Tomcat http://tomcat.apache.org/ Java SE Development Kit 7 WINDOWS版 http://www…