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"
2、在jsp页面指定ocx控件的信息
注:id是唯一标识,codebase指明CAB文件的位置和版本信息,clsid是要注册控件的信息。<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>
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();
}
}