实验:网页CAB控件打包和下载

/**

* note

* 带上系统有的Dll, 比如mfc42.dll, msvcrt.dll, ssleay32.dll, libeay32.dll等,

* 实验表明, 如果系统中的Dll和CAB中的Dll版本不同, 会导致CAB中的ocx下载后,注册不上.

* 如果CAB中不自带这些Dll, 有潜在问题. 当CAB中的ocx, exe, dll依赖特定版本的系统Dll时,程序运行不正常.

* 解决方法(需要验证): 在.inf中指定每一个文件的FileVersion, 用本地的测试网页测试,看是否运行正常.

*/

 

我缺张证书, CAB没有进行签名, 测试页面运行后, 执行ocx中的方法失败, 在IE的加载项中没有看到MainOcx.ocx, ocx没有注册上.

只能换个测试环境,再研究了. 或者先写最简单的单ocx, 然后慢慢加入其他的exe, dll, 再做实验。

 

手头有个demo的CAB是好的,在我的PC上也不行.

 

参考资料:

http://hi.baidu.com/flfboy/blog/item/9e4ca512d36500c7c3fd789b.html

 

改变下载的路径

http://topic.csdn.net/t/20020814/17/940677.html

 

实验还没做通, 在刚装好的Xp + vmware, 不能正常的下载. IE设置安全级别已经设定, 安全站点已经把lcoalhost和127.0.0.1加入了.

感觉还是inf写的有问题,已经调整了inf中文件的加入的顺序.

 

实验一下对mfc的dll也加入RegisterServer=yes. 和下载的路径到系统文件绝对不可能存在的路径.

 

实验确定, 是inf写的不对. 从百度文库上找了一篇资料, 搞定. 这篇资料好的地方是, 可以把cab内的文件解压到system32目录下的子目录下, 这就避免了和系统Dll冲突的可能性.

 

只要inf写对了, 不签名降低安全级别也能运行.

最后正确的inf如下:

;---------------------------------------- ;MainOcx.inf, MainOcx.CAB的INF文件 ;---------------------------------------- ;---------------------------------------- ;CAB包内的文件列表 ;---------------------------------------- ;mfc42.dll 文件版本号: [6.2.8073.0] ;msvcrt.dll 文件版本号: [7.0.2600.5512] ;msvcr71.dll 文件版本号: [7.10.3052.4] ;libeay32.dll 文件版本号: [0.9.8.12] ;ssleay32.dll 文件版本号: [0.9.8.12] ;exeCallByOcx1.exe 文件版本号: [1.0.0.3] ;MainOcx.ocx 文件版本号: [1.0.0.1] ;---------------------------------------- ;版本信息 ;---------------------------------------- [version] signature="$CHICAGO$" AdvancedINF=2.0 ;---------------------------------------- ;安装信息 ;---------------------------------------- [DefaultInstall] CopyFiles=InstallFilesSection,InstallInfSection RegisterOCXs=RegisterOCXSection [DefaultUninstall] cleanup=1 Delfiles=MainOcx.ocx [RegisterOCXSection] "%11%/MainOcx/MainOcx.ocx" [UnRegisterOCXSection] "%11%/MainOcx/MainOcx.ocx" [InstallFilesSection] mfc42.dll=mfc42.dll msvcrt.dll=msvcrt.dll msvcr71.dll=msvcr71.dll libeay32.dll=libeay32.dll ssleay32.dll=ssleay32.dll exeCallByOcx1.exe=exeCallByOcx1.exe MainOcx.ocx=MainOcx.ocx [InstallInfSection] MainOcx.inf=MainOcx.inf ;---------------------------------------- ;文件属性定义 ;---------------------------------------- ;mfc42.dll 文件版本号: [6.2.8073.0] [mfc42.dll] file-win32-x86=thiscab FileVersion=6,2,8073,0 RegisterServer=no DestDir=InstallFilesSection ;msvcrt.dll 文件版本号: [7.0.2600.5512] [msvcrt.dll] file-win32-x86=thiscab FileVersion=7,0,2600,5512 RegisterServer=no DestDir=InstallFilesSection ;msvcr71.dll 文件版本号: [7.10.3052.4] [msvcr71.dll] file-win32-x86=thiscab FileVersion=7,10,3052,4 RegisterServer=no DestDir=InstallFilesSection ;libeay32.dll 文件版本号: [0.9.8.12] [libeay32.dll] file-win32-x86=thiscab FileVersion=0,9,8,12 RegisterServer=no DestDir=InstallFilesSection ;ssleay32.dll 文件版本号: [0.9.8.12] [ssleay32.dll] file-win32-x86=thiscab FileVersion=0,9,8,12 RegisterServer=no DestDir=InstallFilesSection ;exeCallByOcx1.exe 文件版本号: [1.0.0.3] [exeCallByOcx1.exe] file-win32-x86=thiscab FileVersion=1,0,0,3 RegisterServer=no DestDir=InstallFilesSection ;MainOcx.ocx 文件版本号: [1.0.0.1] [MainOcx.ocx] file-win32-x86=thiscab clsid={DABF1FD0-4311-4448-8F53-576F855A9223} FileVersion=1,0,0,1 RegisterServer=yes DestDir=InstallFilesSection ;---------------------------------------- ;目标文件夹定义 ;---------------------------------------- [DestinationDirs] ;安装到%system32%/MainOcx/目录 InstallFilesSection=11,MainOcx ;Inf文件安装到%windir%/inf InstallInfSection=17

html测试代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <title> LostSpeed的测试页 </title> <mce:script type="text/javascript"><!-- //javascript 脚本 function CallOcx() { var varMsg; var var1; var fso; var windir; var myPathName; MainOcx.AboutBox(); var1 = MainOcx.CallMyExe(); varMsg = "MyOcx.CallMyExe() ="; varMsg += var1; alert(varMsg); var1 = MainOcx.ShowAllFileVersionInCab(); varMsg = "MyOcx.ShowAllFileVersionInCab() ="; varMsg += var1; alert(varMsg); fso = new ActiveXObject("Scripting.FileSystemObject"); windir = fso.GetSpecialFolder(0); myPathName = windir; myPathName += "//system32//MainOcx//exeCallByOcx1.exe"; var1 = MainOcx.CalculateFileSha1(myPathName); varMsg = "MyOcx.CalculateFileSha1("; varMsg += myPathName; varMsg += "/") = "; varMsg += var1; alert(varMsg); } function init() { CallOcx(); } // --></mce:script> <body onLoad="init()"> <h1> 这个实验的功能是:<br> 1.页面加载时,自动下载MainOcx.CAB<br> 2.执行MainOcx.Ocx中方法的定义的4个方法<br> <br> void AboutBox();<br> long CallMyExe();<br> BSTR CalculateFileSha1(BSTR lpFilename);<br> long ShowAllFileVersionInCab(); </h1> <OBJECT id="MainOcx" height=0 width=0 classid="CLSID:DABF1FD0-4311-4448-8F53-576F855A9223" CODEBASE="MainOcx.CAB" style="visibility: Hidden;" > </OBJECT> </body> </html>

运行效果

实验:网页CAB控件打包和下载_第1张图片

实验:网页CAB控件打包和下载_第2张图片

实验:网页CAB控件打包和下载_第3张图片

实验:网页CAB控件打包和下载_第4张图片

实验:网页CAB控件打包和下载_第5张图片

实验:网页CAB控件打包和下载_第6张图片

工程下载点:

实验:网页CAB控件打包和下载_第7张图片

你可能感兴趣的:(实验:网页CAB控件打包和下载)