2017年09月19日 10:14:32
ActiveX控件对于大多数开发人员来说并不陌生,很多情况下我们都会利用ActiveX控件调用一些证书。ActiveX控件注册分为两种:一种手动注册;一种自动注册。
接下来,我将介绍一下ActiveX在IE上实现自动下载和注册。首先,我们需要将注册的控件、所依赖的库、安装文件(.inf)打包成CAB文件。然后将CAB文件放入WEB项目中。如何打包CAB文件,我在这里不加以说明,需要用到的时候,自己上网查询一下就能完成。重点说一下inf文件,这是这个CAB文件和实现下载并自动注册的重中之重,如果inf文件不正确,CAB包不能正常下载和注册。
1、inf文件详细信息
- version:指定文件的版本信息;
- [version]Signature="$Chicago$"
- AdvancedINF=2.0
- Defaultinstall:是指CAB文件默认安装的信息,CopyFiles是要复制到目的路径下的文件,RegisterOCXs是要注册的OCX控件信息;
- [Defaultinstall]
- CopyFiles=files
- RegisterOCXs=RegisterFiles
- SourceDisksNames:是指源文件的名称;
- [SourceDisksNames]
- 1=%DiskName%,SRQ24Ctl.cab,1
- SourceDisksFiles:是指要注册的文件;
- [SourceDisksFiles]
- SRQ24Ctl.ocx=1
- [RegisterFiles]
- %30%\Windows\SysWOW64\SRQ24Ctl.ocx
- DestinationDirs:文件安装的目录,SysWoW64是64位操作系统的安装路径;
- [DestinationDirs]
- files=30,Windows\SysWOW64
- files:是指复制到目的路径下的源文件;
- [files]
- SRQ24Ctl.ocx=SRQ24Ctl.ocx
- Cryptlib.dll=Cryptlib.dll
- DAFK.dll=DAFK.dll
- daiclib.dll=daiclib.dll
- DAUK.dll=DAUK.dll
- DHKEY.dll=DHKEY.dll
- DKEY.dll=DKEY.dll
- DSFK.dll=DSFK.dll
- dtall.dll=dtall.dll
- DticTokenApi.dll=DticTokenApi.dll
- DTLog.dll=DTLog.dll
- GenEccKey.dll=GenEccKey.dll
- icapi.dll=icapi.dll
- IcForCsp.dll=IcForCsp.dll
- libDADer.dll=libDADer.dll
- libeay32.dll=libeay32.dll
- nodrvkey.dll=nodrvkey.dll
- pklibv3.dll=pklibv3.dll
- SM3.dll=SM3.dll
- storkey.dll=storkey.dll
- xcsp_eclib.dll=xcsp_eclib.dll
- SRQ24Ctl.ocx:是注册控件的详细信息;file-win32-x86中的file是指文件、win32是指windows系统、x86指系统位数;RegisterServer=yes说明该文件自动注册,clsid指文件的注册码;
- [SRQ24Ctl.ocx]
- file-win32-x86=thiscab
- RegisterServer=yes
- clsid={09AC9B85-5A51-4106-AC35-5B8025A2C18C}
- DestDir=11
- FileVersion=3,0,0,0
- String:指明文件的目的路径;
- [String]
- DiskName="Windows\SysWOW64"
version:指定文件的版本信息;
[version]Signature="$Chicago$"
AdvancedINF=2.0
Defaultinstall:是指CAB文件默认安装的信息,CopyFiles是要复制到目的路径下的文件,RegisterOCXs是要注册的OCX控件信息;
[Defaultinstall]
CopyFiles=files
RegisterOCXs=RegisterFiles
SourceDisksNames:是指源文件的名称;
[SourceDisksNames]
1=%DiskName%,SRQ24Ctl.cab,1
SourceDisksFiles:是指要注册的文件;
[SourceDisksFiles]
SRQ24Ctl.ocx=1
[RegisterFiles]
%30%\Windows\SysWOW64\SRQ24Ctl.ocx
DestinationDirs:文件安装的目录,SysWoW64是64位操作系统的安装路径;
[DestinationDirs]
files=30,Windows\SysWOW64
files:是指复制到目的路径下的源文件;
[files]
SRQ24Ctl.ocx=SRQ24Ctl.ocx
Cryptlib.dll=Cryptlib.dll
DAFK.dll=DAFK.dll
daiclib.dll=daiclib.dll
DAUK.dll=DAUK.dll
DHKEY.dll=DHKEY.dll
DKEY.dll=DKEY.dll
DSFK.dll=DSFK.dll
dtall.dll=dtall.dll
DticTokenApi.dll=DticTokenApi.dll
DTLog.dll=DTLog.dll
GenEccKey.dll=GenEccKey.dll
icapi.dll=icapi.dll
IcForCsp.dll=IcForCsp.dll
libDADer.dll=libDADer.dll
libeay32.dll=libeay32.dll
nodrvkey.dll=nodrvkey.dll
pklibv3.dll=pklibv3.dll
SM3.dll=SM3.dll
storkey.dll=storkey.dll
xcsp_eclib.dll=xcsp_eclib.dll
SRQ24Ctl.ocx:是注册控件的详细信息;file-win32-x86中的file是指文件、win32是指windows系统、x86指系统位数;RegisterServer=yes说明该文件自动注册,clsid指文件的注册码;
[SRQ24Ctl.ocx]
file-win32-x86=thiscab
RegisterServer=yes
clsid={09AC9B85-5A51-4106-AC35-5B8025A2C18C}
DestDir=11
FileVersion=3,0,0,0
String:指明文件的目的路径;
[String]
DiskName="Windows\SysWOW64"
2、在jsp页面指定ocx控件的信息
- <OBJECT id="PXCtl" style="display:none" codebase="<%=request.getContextPath() %>/SRQ24Ctl.cab#version=1,6,0,1"
- classid="CLSID:09AC9B85-5A51-4106-AC35-5B8025A2C18C" type="application/x-oleobject" VIEWASTEXT>
- </OBJECT>
<OBJECT id="PXCtl" style="display:none" codebase="<%=request.getContextPath() %>/SRQ24Ctl.cab#version=1,6,0,1"
classid="CLSID:09AC9B85-5A51-4106-AC35-5B8025A2C18C" type="application/x-oleobject" VIEWASTEXT>
</OBJECT>
注:id是唯一标识,codebase指明CAB文件的位置和版本信息,clsid是要注册控件的信息。
3、在后台实现CAB文件下载
- @Controller
- public class ActiveController {
- /**
- * 获取CAB文件
- * @param request
- * @param response
- * @return
- */
- @RequestMapping(value = "/SRQ24Ctl.cab",method = RequestMethod.GET)
- public ModelAndView getActiveComponent(HttpServletRequest request, HttpServletResponse response){
- response.setCharacterEncoding("UTF-8");
- String filePath = "";
- String fileName = "SRQ24Ctl.cab";
- String contentType = "application/octet-stream";
- //下载文件
- try {
- this.downloadFile(request,response,filePath,fileName,contentType);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- //文件下载
- public void downloadFile(HttpServletRequest request,HttpServletResponse response,String filePath,String fileName,String contentType) throws IOException {
- //设置响应编码
- response.setCharacterEncoding("UTF-8");
- //获取应用路径
- String path = request.getSession().getServletContext().getRealPath("/");
- //获取下载路径
- String downloadPath = path+filePath+fileName;
- //获取下载文件的长度
- long fileLength = new File(downloadPath).length();
- //配置下载参数
- response.setContentType(contentType);
- response.setHeader("Content-disposition","attachment;filename="+fileName);
- response.setHeader("Content-Length",String.valueOf(fileLength));
- //创建输入输出流
- InputStream bis = new BufferedInputStream(new FileInputStream(downloadPath));
- // 存放路径
- //String descPath = System.getProperty("user.home") + File.separator+"MIS_DATA"+File.separator+"CAB"+File.separator+"SRQ24Ctl.cab";
- OutputStream bos = new BufferedOutputStream(response.getOutputStream());
- //OutputStream bos = new BufferedOutputStream(new FileOutputStream(descPath));
- byte[] buffer = new byte[1024*8];
- int len = 0;
- //循环读写
- while((len = bis.read(buffer,0,buffer.length)) != -1){
- bos.write(buffer,0,len);
- bos.flush();
- }
- //关闭流
- bos.close();
- bis.close();
- }
- }