RES協定是一種IE顯示錯誤頁面,查看頁面的來源的IE 4.0預定義的協定。
基本介紹
- 中文名:RES協定
- 來源:IE顯示錯誤頁面,查看頁面的來源
- 性質:一種協定
- 特點:是IE 4.0預定義的協定
什麼是res協定?,簡單介紹,
什麼是res協定?
當在IE的地址欄裡面輸入了一個錯誤的地址的時候,IE會顯示錯誤頁面。在錯誤頁面上,右擊然後點屬性,查看頁面的來源你會發現它是一個類似這樣的連線:res://C:/WINDOWS/system32/shdoclc.dll/dnserror.htm
以上面這個地址就是res協定的一個例子。"RES://"協定是IE 4.0預定義的一個協定,它可以用來提取程式模組中的資源,如圖片,聲音,字元串等等。這裡的程式模組一般來說指的是符合WIN32 PE格式的檔案,如普通的EXE,DLL等。可以嘗試在IE地址欄裡面輸入以下的內容:
res://shell32.dll/2/131 WindowsXP Professional的表示圖案。
res://shell32.dll/2/147 WindowsXP Home Edition的表示圖案。
簡單介紹
1、MSDN上對res協定的語法的說明中指出,如果路徑中sType和sId是數字的話,必須在前面冠以’#’符,以保證正確,然而我在裝了SP2的IE6.0中試驗的時候發現,如果把sType和sID前面加上’#’符,會出現錯誤;相反,不加的時候就完全沒有問題。猜想可能是微軟在SP2中更正了res的用法,或者是MSDN出現錯誤(這個可能性似乎不是很大)。不過我們的套用完全可以用字元串來代替數字,所以即便是SP2出現的更正也不影響兼容性。
2、以”res://d:/test/mydll.dll/2/234”為例,d:/test/mydll.dll部分,即sFile部分必須是windows格式的路徑,比如你不能寫成d:/test/mydll.dll的形式。後面sType和sID部分則必須是’/’的形式,不然會出問題。還有一個小問題,怎樣知道一個dll或者exe裡面有什麼資源呢?這當然要用到大名鼎鼎的資源提取工具eXeScope。用eXeScope打開一個exe或者dll,就可以很方便的瀏覽,修改,提取它的資源,即便是某些加殼的程式,所以eXeScope也可用作簡單的軟體漢化。
到現在,res協定的套用方面沒問題了,我們討論的下一個問題是創建一個資源DLL。以VC6為例,
1、新建一個工程,類型選擇Win32 Dynamic-Link Library。輸入工程名字Test。點擊OK
2、DLL類型中,選擇An Empty DLL Project。然後點擊Finish。
3、這個時候工程是空的,什麼都沒有。我們需要為其添加一個資源腳本。點File->New,在Files選項卡裡面選擇Resource Script,輸入檔案名稱字test.rc,然後點OK。這樣工程中就包含了一個資源腳本檔案。點開File View,在Source Files中可以看到它。選中它,然後點擊右鍵,選擇打開,在Work Space中就會出現Resource View選項卡。方便以後的添加資源操作。
4、點Project->settings…,然後Setting For選擇Win32 Release,右邊點開link選項卡,在最下面Project Options裡面添加/NOENTRY參數,記得與之前或者之後的參數用空格間開。這個參數是資源DLL連線成功的基礎。
5、點Build->Batch Build…,只選則Win32 Release,然後點Build。生成Release版本的資源DLL。當然以上步驟創建的DLL僅僅是個空殼,沒有資源在內,下面討論添加資源進DLL。在Resource View中,右鍵然後選擇Insert,彈出對話框,選擇新建(new)或者import。以import為例,如果想添加的資源是點陣圖等預定義的,可直接選中要引入的檔案然後import。如果是自定義類型的,就要填寫類型的名稱(將來res地址中的sType)。
一般引入資源後,VC自動為資源定義一個ID,一般都是數字的形式。當然我們也可以自定義ID,如我們想為一個JPG圖像定義ID為Test.jpg,則打開該資源的屬性對話框,然後ID欄裡面填寫”Test.jpg”,注意,這裡的””不能省略,否則VC會不接受輸入(‘.’的存在),或者仍然為他設定一個數字作為ID(如設定為TEST,則仍然是一個數字)。
再有,如果要添加的資源包含目錄層次該怎么辦呢?比如所,要添加一個頁面test.htm,頁面中有個連線指向images資料夾下的miki.jpg,即:<img src=”images/miki.jpg”>.該怎么添加呢?首先肯定的一點是他們都必須放在同一種類型的資源下,比如自定義資源TEST。然後再TEST底下添加一個目錄嗎?我試了很久都沒添加上(如果某位Super high hand知道怎么做,麻煩跟我共享下)。
所以採用了一種比較笨的方法:在設定資源ID的時候體現出這個目錄層次來,即test.htm的ID設為“test.htm”, miki.jpg的ID設為“images/miki.jpg”。然後做成資源DLL測試”res://test.dll/TEST/test.htm”成功。同時為了確保資源釋放的時候是按照目錄層次,而不是因為把”images/miki.jpg”作為一個名字來釋放(因為這時候test.htm仍然能夠正確連線圖片),重新作了一個測試:
1、test.htm中的連線改為<img src=”../images/miki.jpg”>.
2、修改test.htm的ID為”test/test.htm”,此時miki.jpg的ID為”images/miki.jpg”.生成DLL後測試”res://test.dll/TEST/test/test.htm”成功。證明這種方法是有效的。