Access迈向web化的第一步:就是解决Res协议,并且要解决把html文件包编译成DLL文件。
我在其它文章提过,Webbrowser控件支持Res协议,在winxp+Access03,win8.1+Access2010,win10+access2016的环境下都支持。
所以了解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。
说明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部分则必须
是’/’的形式,不然会出问题。
- RC文件、Res文件和DLL文件是什么关系,有什么区别?
统一资源管理:在win32编程中,为方便项目中的资源统一管理,提供了一个格式统一的资源文件,对各种资源进行管理。它的扩展名是.rc,在程序编译时它会被资源编译器编译生成一个.res的二进制文件。
rc文件的语法:
1.注释:注释方式和 C 语言相通,单行注释用 // 符号,多行注释用 /* ... */ 符号。
2.预处理命令:预处理指令包括一些头文件的引用(使用 #include ,也同 C 语言)。
3.编译指令:预定义(#define,常量和宏,不支持带参数的宏) 和 条件编译(#if, #ifdef, #undef, #ifndef, #else, #elif, #endif 等)。
4.资源定义声明:资源定义的声明中包括“资源”(Resources),"控件"(Controls) 和 “声明”(Statements) 3 类。
RC文件是文本文件,跟txt没有什么区别。Res文件是RC已经编译过的资源文件,是二进制文件。
在了解了Res协议之后,我们接下来的问题,就是如何把众多的html、js、css、各种图片、flash等文件编译成一个dll文件。
开始我还以为是一件很容易的事情,结果完全让人大跌眼镜,非常的痛苦。主要是因为网络上的教程非常的少,而且对这种工具的介绍也是非常的少。我几乎是碾转使用了5种以上的工具,才找到适合自己的(而且还是很原始的),如果有谁有比较多的这种经验,可以多分享和介绍一下。
问题点1: html文件的相对路径和绝对路径如何解决?
一个html文件常常包含了很多个js,css文件,这些js和css文件的ref,在网站上是使用相对路径。而且在平时调试js和html中,也应该保持这种相对路径。如何在RC文件中解决html引用的相对路径,是一个很大的难点。
在这里,在RC文件中使用默认的html类型,还是使用自定义类型,有一些细节上的区别:
(1).如果使用了HTML类型,URL中不用写类型域,nameID、typeID中不可以包含"/",但可以用"\",网页之中的超链接<a>中要写"\",原因是URL最终会合成作为res://的sID字段域,否则res://访问会出错,而且res://协议没有默认首页这么个概念,所以也要注意这里和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文件的字符集的选择。现在utf-8几乎是html的统一字符集。而且ajax默认也是utf-8字符集。这本来在网页中没有什么问题,但因为我们是在Access中使用html,vba对utf-8处理不好,所以一般最好把html文件转成gb2312或ansi格式。小心gbk字符集,这在很多的resource编译工具,不能正确显示html源文件。
问题点3:Res协议中的几个特殊符号要特别注意
一般Res://文件路径中包含着特殊符号,ie会自动进行转换,这几个特殊符号是:%3A (":"), %5C ("\"), %20 (space) 和 %23 ("#")。
具体在实际使用中,如果遇到这几个特殊符号,你要特别注意。特别是在网页中<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参数是指不用在内存中常驻。*/
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格式,也就是已经编译好的二进制文件,这没关系,因为这是第一步而已,只不过因为它比较简单易用,而且大家也会比较熟悉。
Rc.exe编辑完res文件之后,另存为一个单独的res格式文件。
2、必须要用到的工具ResEdit1.66,这是一个开源免费的resource编辑工具,自带了编译器。网络上很容易下载得到(中文版),有32/64位版,我们一般用32位版ResEdit。ResEdit是专门为c/c++用的资源编辑器。所以不要用它来新建Rc文件,因为它新建的Rc文件,编译成dll,不符合Res协议。
把vb6的RC.exe编辑完的res格式文件,用ResEdit打开,然后另存为一个dll文件,这样就是一个纯资源的DLL文件,完全符合Res协议使用。
如果你不想安装vb6。那也可以随便按照上面的格式,写一个Rc文件模板,然后用ResEdit打开,开始添加资源,然后编译成dll也可以。