Access邁向web化的第一步:就是解決Res協(xié)議,并且要解決把html文件包編譯成DLL文件。
我在其它文章提過,Webbrowser控件支持Res協(xié)議,在winxp+Access03,win8.1+Access2010,win10+access2016的環(huán)境下都支持。
所以了解Res協(xié)議就變得比較重要了。
"RES://"協(xié)議是IE 4.0預定義的一個協(xié)議,它的具體語法為:
RES://resource file[/resourcetype]/resource id
resource file:含有資源的模塊的文件名,請注意這里的路徑分隔符只能使用“\”,而不能使用“/”。
Resourcetype:資源類型,它是一個字符串或數(shù)字。常用的資源類型都對應著一個數(shù),比如BITMAP對應著RT_BITMAP=2,
這些常數(shù)定義在VC++的WINUSER.H可以找到,如果資源類型是數(shù)字,要在數(shù)字前面加上“#”號。Resourcetype可以省略,
默認為RT_HTML=23,即HTML文件。RT_HTML在VC++ 5.0中沒有定義,但現(xiàn)在已經(jīng)廣泛使用。
Resource id:資源的ID號。在這里要注意一個問題:在VC++中定義資源的時候,通常是使用數(shù)字常量,比如ID_BITMAP1,
它代表的數(shù)字可能是101。而在使用res://協(xié)議時,不能使用ID_BITMAP1(在DLL中并沒有這個符號),而必須使用#101來代表資源。
例如要顯示一個位圖資源,其ID號為101,應為RES://mydll.dll/#2/#101。
說明1、MSDN上對res協(xié)議的語法的說明中指出,如果路徑中sType和sId是數(shù)字的話,必須在前面冠以’#’
符,以保證正確,
然而我在裝了SP2的IE6.0中試驗的時候發(fā)現(xiàn),如果把sType和sID前面加上’#’符,會出現(xiàn)錯誤;相反,不加的時候就完全沒有
問題。
猜想可能是微軟在SP2中更正了res的用法,或者是MSDN出現(xiàn)錯誤(這個可能性似乎不是很大)。不過我們的應用完全可以用字符串來代替數(shù)字,
所以即便是SP2出現(xiàn)的更正也不影響兼容性。
說明2、以”res://d:/test/mydll.dll/2/234”為例,d:/test/mydll.dll
部分,即sFile部分必須是windows格式的路徑,
比如你不能寫成d:/test/mydll.dll的形式。后面sType和sID部分則必須
是’/’的形式,不然會出問題。
- RC文件、Res文件和DLL文件是什么關系,有什么區(qū)別?
統(tǒng)一資源管理:在win32編程中,為方便項目中的資源統(tǒng)一管理,提供了一個格式統(tǒng)一的資源文件,對各種資源進行管理。它的擴展名是.rc,在程序編譯時它會被資源編譯器編譯生成一個.res的二進制文件。
rc文件的語法:
1.注釋:注釋方式和 C 語言相通,單行注釋用 // 符號,多行注釋用 /* ... */ 符號。
2.預處理命令:預處理指令包括一些頭文件的引用(使用 #include ,也同 C 語言)。
3.編譯指令:預定義(#define,常量和宏,不支持帶參數(shù)的宏) 和 條件編譯(#if, #ifdef, #undef, #ifndef, #else, #elif, #endif 等)。
4.資源定義聲明:資源定義的聲明中包括“資源”(Resources),"控件"(Controls) 和 “聲明”(Statements) 3 類。
RC文件是文本文件,跟txt沒有什么區(qū)別。Res文件是RC已經(jīng)編譯過的資源文件,是二進制文件。
在了解了Res協(xié)議之后,我們接下來的問題,就是如何把眾多的html、js、css、各種圖片、flash等文件編譯成一個dll文件。
開始我還以為是一件很容易的事情,結(jié)果完全讓人大跌眼鏡,非常的痛苦。主要是因為網(wǎng)絡上的教程非常的少,而且對這種工具的介紹也是非常的少。我?guī)缀跏悄朕D(zhuǎn)使用了5種以上的工具,才找到適合自己的(而且還是很原始的),如果有誰有比較多的這種經(jīng)驗,可以多分享和介紹一下。
問題點1: html文件的相對路徑和絕對路徑如何解決?
一個html文件常常包含了很多個js,css文件,這些js和css文件的ref,在網(wǎng)站上是使用相對路徑。而且在平時調(diào)試js和html中,也應該保持這種相對路徑。如何在RC文件中解決html引用的相對路徑,是一個很大的難點。
在這里,在RC文件中使用默認的html類型,還是使用自定義類型,有一些細節(jié)上的區(qū)別:
(1).如果使用了HTML類型,URL中不用寫類型域,nameID、typeID中不可以包含"/",但可以用"\",網(wǎng)頁之中的超鏈接<a>中要寫"\",原因是URL最終會合成作為res://的sID字段域,否則res://訪問會出錯,而且res://協(xié)議沒有默認首頁這么個概念,所以也要注意這里和http://訪問時會有不同。
(2). 如果使用了自定義的資源,在URL中要把typeID寫上,看上去就像是一個目錄,你可以在nameID中使用"/",typeID中不要用,"\"幾乎可以自由使用。自定義類型時必須在URL中寫明類型域。
如:res://F:\ResDLL_test\release\ResDLL_test.dll/custom/htmlpage/1/1.html
其中custom為sType域,htmlpage/1/1.html為sID域,和資源中的nameID相符。因為是自定義類型為custom,所以Res路徑中custom必須寫上。
在實際使用中,一般還是使用自定義類型,會來得更靈活一些,方便和html文件包的整個目錄進行映射,而無須改動html中的引用。
問題點2:html文件的字符集的選擇。現(xiàn)在utf-8幾乎是html的統(tǒng)一字符集。而且ajax默認也是utf-8字符集。這本來在網(wǎng)頁中沒有什么問題,但因為我們是在Access中使用html,vba對utf-8處理不好,所以一般最好把html文件轉(zhuǎn)成gb2312或ansi格式。小心gbk字符集,這在很多的resource編譯工具,不能正確顯示html源文件。
問題點3:Res協(xié)議中的幾個特殊符號要特別注意
一般Res://文件路徑中包含著特殊符號,ie會自動進行轉(zhuǎn)換,這幾個特殊符號是:%3A (":"), %5C ("\"), %20 (space) 和 %23 ("#")。
具體在實際使用中,如果遇到這幾個特殊符號,你要特別注意。特別是在網(wǎng)頁中<a></a>中如果有使用#,則要特別留意。
問題點4:自動化處理RC文件映射html文件目錄
如果html文件包有著很多的文件,那么使用vbs之類的腳本來自動化寫RC文件,幾乎是一件必須要考慮的事情。畢竟寫RC文件是一件很繁瑣的事情。
RC文件定義如下:
基本語法:
nameID typeID filename
nameID typeID { raw-data }
一個完整的RC文件如下:
#define VERINFO 1 /* 版本信息 1 */
#define GIF 2110 /* 自定義類型編號要求 (> 255) */
HOME HTML DISCARDABLE "Home.htm" /*discardable參數(shù)是指不用在內(nèi)存中常駐。*/
ABOUT HTML DISCARDABLE "About.htm"
Dot.gif GIF "Dot.gif"
BG.gif GIF "BG.gif"
接下來這段意義不大,主要用于版本信息:
/* Begin Version Info Block. The Main Block Information can be retrieved through GetFileVersionInfo API */
VERINFO VERSIONINFO
FILEVERSION 1,0,0,0 /* VS_VERSIONINFO : File version Bytes */
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK 0x3fL /* Mask for valid members of FILEFLAGS */
FILEFLAGS 0x0L
FILEOS 0x10004L /* VOS_DOS_WINDOWS32 */
FILETYPE 0x1L /* VFT_APP = Application */
FILESUBTYPE 0x0L /* Who knows */
/* This is the Block that appears in the File Properties Dialog */
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0" /* English : 0409 and Character Set : 1200 : Unicode */
BEGIN
VALUE "Comments", "This file is used as the Resource file for resHTML project at http:\\\\eswar_santhosh.tripod.com \0"
VALUE "CompanyName", "C. Eswar Santhosh\0"
VALUE "FileDescription", "ResHTML Application Resource DLL\0"
VALUE "FileVersion", "1.00\0"
VALUE "InternalName", "rcHTML\0"
VALUE "LegalCopyright", "Copyright ?C. Eswar Santhosh, 2000\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "rcHTML.dll\0"
VALUE "ProductName", "ResHTML\0"
VALUE "ProductVersion", "1.00\0"
/* Additional Values can be added here */
VALUE "Web Site", "http:\\\\eswar_santhosh.tripod.com\0"
VALUE "Mail", "eswar_santhosh@yahoo.com"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
/* End Version Info Block */
二、
使用什么工具編譯dll? 1、菜鳥級工具:vb6
一般來說,常寫vba代碼,最好安裝一下vb6。因為不時會用得到它。這里用的是vb6的資源編輯器RC.exe。
vb6的資源編輯器添加的資源文件是res格式,也就是已經(jīng)編譯好的二進制文件,這沒關系,因為這是第一步而已,只不過因為它比較簡單易用,而且大家也會比較熟悉。
Rc.exe編輯完res文件之后,另存為一個單獨的res格式文件。
2、必須要用到的工具ResEdit1.66,這是一個開源免費的resource編輯工具,自帶了編譯器。網(wǎng)絡上很容易下載得到(中文版),有32/64位版,我們一般用32位版ResEdit。ResEdit是專門為c/c++用的資源編輯器。所以不要用它來新建Rc文件,因為它新建的Rc文件,編譯成dll,不符合Res協(xié)議。
把vb6的RC.exe編輯完的res格式文件,用ResEdit打開,然后另存為一個dll文件,這樣就是一個純資源的DLL文件,完全符合Res協(xié)議使用。
如果你不想安裝vb6。那也可以隨便按照上面的格式,寫一個Rc文件模板,然后用ResEdit打開,開始添加資源,然后編譯成dll也可以。