1.什麼是res協定?
"RES://"協定是IE 4.0預定義的一個協定,它的具體語法為:"RES://resource file[/resourcetype]/resource id"。
resource file:含有資源的模組的檔案名稱,請注意這裡的路徑分隔設定只能使用“\”,而不能使用“/”。
Resourcetype:資源類型,它是一個字元串或數字。常用的資源類型都對應著一個數,比如BITMAP對應著RT_BITMAP=2,這些常數定義在VC++的WINUSER.H可以找到,如果資源類型是數字,要在數字前面加上“#”號。Resourcetype可以省略,默認為RT_HTML=23,即HTML檔案。RT_HTML在VC++ 5.0中沒有定義,但現在已經廣泛使用。
Resource id:資源的ID號。在這裡要注意一個問題:在VC++中定義資源的時候,通常是使用數字常量,比如ID_BITMAP1,它代表的數字可能是101。而在使用res://協定時,不能使用ID_BITMAP1(在DLL中並沒有這個符號),而必須使用#101來代表資源。例如要顯示一個點陣圖資源,其ID號為101,應為RES://mydll.dll/#2/#101。
2.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/131res://shell32.dll/2/147註:第一個是windows xp professional的表示圖案。第二個是windows xp home edition的表示圖案。
3.使用詳解
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。點擊OK2、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,則仍然是一個數字)。
4.包含目錄的方法。
再有,如果要添加的資源包含目錄層次該怎么辦呢?比如所,要添加一個頁面test.htm,頁面中有個連線指向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中的連線改為.
2、修改test.htm的ID為”test/test.htm”,此時miki.jpg的ID為”images/miki.jpg”.
3。生成DLL後測試”res://test.dll/TEST/test/test.htm”成功。證明這種方法是有效的。