网页下载CAB文件总结
原来的程序是一个EXE,现在需要封装成COM,然后打包成CAB文件,让客户通过网页调用。耗费了两天时间终于完成了,总结一下。
1、最初我是用VC6.0的MFC ActiveX生成了OCX,OCX中有一个对话框,通过IE控件来显示一个生成的网页文件,写完之后发现通过外部IE调用OCX的时候对话框中的IE控件显示不出来需要加载的网页。
没办法,只能让OCX返回网页文件的地址,再通过JS的window.open来显示网页。
2、实现了网页的显示,我以为已经完成了90%的工作,挺高兴,原来预计两天时间的任务不到一天就完成了,感觉挺爽,那就用一个小时的时间完成剩下的10%吧,用iexpress把OCX及相关的动态库打包成CAB文件,
挠头的事情发生了,网页无法下载这个CAB文件!更别提注册了!反复研究INF文件,反复生成CAB,反复的失败...
怀疑打包程序,用iexpress,用CABARC,甚至用VB自带的打包程序,结果都一样,失败,排除打包程序的问题,还是别冤枉微软了。
怀疑INF文件有问题,重写了一个MFC ActiveX小程序,INF文件简单的不能再简单了,打包,失败,排除INF文件问题。
...
一个同事问我,你的COM标准吗?靠,这个问题问的太好了!堪比“人为什么活着?”!赶紧用ATL COM生成一个小例子,打包成CAB,成功了!!!
严重鄙视MFC ActiveX,不伦不类的东西。
3、主要技术点:
INF文件的格式:
INF文件的格式
;INF file for tkSoundExe.exe
;DestDir can be 10 for Windows directory, 11 for Windows\System(32) directory, or left blank for the Occache directory.
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[DefaultInstall]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[RInstallApplicationFiles]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[DestinationDirs]
install.files=11
[SourceDisksNames]
1=%DiskName%,RptView.CAB,1
[Add.Code]
RptView.dll=RptView.dll
MSVCP60.DLL=MSVCP60.DLL
MSVCP60D.DLL=MSVCP60D.DLL
MSVCRT.DLL=MSVCRT.DLL
MFC42.DLL=MFC42.DLL
MSVCRTD.DLL=MSVCRTD.DLL
cppbind.dll=cppbind.dll
CacheODBC.dll=CacheODBC.dll
RisDll.dll=RisDll.dll
FTPClient.dll=FTPClient.dll
ris.ini=ris.ini
[install.files]
MSVCP60.DLL=MSVCP60.DLL
MSVCP60D.DLL=MSVCP60D.DLL
MSVCRT.DLL=MSVCRT.DLL
MFC42.DLL=MFC42.DLL
MSVCRTD.DLL=MSVCRTD.DLL
cppbind.dll=cppbind.dll
CacheODBC.dll=CacheODBC.dll
RisDll.dll=RisDll.dll
FTPClient.dll=FTPClient.dll
ris.ini=ris.ini
RptView.dll=RptView.dll
[SourceDisksFiles]
MSVCP60.DLL=1
MSVCP60D.DLL=1
MSVCRT.DLL=1
MFC42.DLL=1
MSVCRTD.DLL=1
cppbind.dll=1
CacheODBC.dll=1
RisDll.dll=1
FTPClient.dll=1
ris.ini=1
RptView.dll=1
[RptView.dll]
file-win32-x86=thiscab
RegisterServer=yes
clsid={279662D5-3EAE-4BD3-A8E0-8A503AA4F616}
DestDir=11
FileVersion=1,0,0,1
[MSVCP60.DLL]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=6,0,8972,0
[MSVCP60D.DLL]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=6,0,8972,0
[MSVCRT.DLL]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=6,1,9844,0
[MFC42.DLL]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=6,0,9586,0
[MSVCRTD.DLL]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=6,0,9782,0
[cppbind.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=5,0,5105,0
[CacheODBC.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=5,0,5105,0
[RisDll.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=1,0,0,1
[FTPClient.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=1,0,0,1
[ris.ini]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
[RegisterFiles]
%11%\RptView.dll
在JS文件中,写下载CAB文件的代码:
document.write("<OBJECT ID='RptView' WIDTH=0 HEIGHT=0 CLASSID='CLSID:279662D5-3EAE-4BD3-A8E0-8A503AA4F616' CODEBASE='../addins/client/RptView.CAB#version=1,0,0,1'>");
document.write("</object>");
注意:CODEBASE最好为相对路径。
在JS文件中,调用COM接口,并弹出网页文件。
var objVar = RptView.GetRptURL("XXXXX");
window.open(objVar,'newwindow','height=700,width=900,top=5,left=150,toolbar=no,menubar=no,scrollbars=yes,resizable=no,location=no, status=no')