1. 程式人生 > >ie瀏覽器呼叫dll中的資源

ie瀏覽器呼叫dll中的資源

什麼是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 res://shell32.dll/2/147 注:
第一個是windows xp professional的表示圖案。 第二個是windows xp home edition的表示圖案。 讓我們來看看MSDN對res protocol是怎麼說的: res Protocol

Specifies a resource that will be obtained from a module.Syntaxres://sFile[/sType]/sIDTokens

sFile Path and file name of the module that contains the resource. sType Optional. String or numerical resource type. This can be either a custom resource or one of the RT_ predefined resource types described in the FindResource function reference. If a numerical resource type is specified, the actual number of the identifier, not the identifier name, must follow a # character. See the example for more information. If this parameter is not specified, the default resource type is
RT_HTML. sID String or numerical identifier of the resource. If a numerical identifier is specified, the actual number of the identifier, not the identifier itself, must follow a # character. See the example for more information.

RemarksAvailable as of Microsoft® Internet Explorer 4.0 or later.Remember, URLs require that special characters such as '#' be escaped. Use '%23' to escape the '#' character.

Note   Internet Explorer 6 Service Pack 1 (SP1) no longer allows browsing a local machine from the Internet zone. For instance, if an Internet site contains a link to a local file, Internet Explorer 6 SP1 displays a blank page when a user clicks on the link. Previous versions of Internet Explorer followed the link to the local file.ExampleThis example shows the correct and incorrect ways to format the numerical identifier for the resource type.#define MYBITMAP 234// This is correct."res://mydll.dll/#2/#234"// This is not correct."res://mydll.dll/#2/MYBITMAP"

以上可以看到res協議較全面的資訊。包括了語法,應用,示例及其相關的說明。 不過這裡有2個小問題: 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”成功。 證明這種方法是有效的。