Active X控件在IE上自动下载并注册

来源:互联网 发布:关于大数据的毕业设计 编辑:程序博客网 时间:2024/06/07 03:02

        ActiveX控件对于大多数开发人员来说并不陌生,很多情况下我们都会利用ActiveX控件调用一些证书。ActiveX控件注册分为两种:一种手动注册;一种自动注册。

        接下来,我将介绍一下ActiveX在IE上实现自动下载和注册。首先,我们需要将注册的控件、所依赖的库、安装文件(.inf)打包成CAB文件。然后将CAB文件放入WEB项目中。如何打包CAB文件,我在这里不加以说明,需要用到的时候,自己上网查询一下就能完成。重点说一下inf文件,这是这个CAB文件和实现下载并自动注册的重中之重,如果inf文件不正确,CAB包不能正常下载和注册。

1、inf文件详细信息

version:指定文件的版本信息;[version]Signature="$Chicago$"AdvancedINF=2.0Defaultinstall:是指CAB文件默认安装的信息,CopyFiles是要复制到目的路径下的文件,RegisterOCXs是要注册的OCX控件信息;[Defaultinstall]CopyFiles=filesRegisterOCXs=RegisterFilesSourceDisksNames:是指源文件的名称;[SourceDisksNames]1=%DiskName%,SRQ24Ctl.cab,1SourceDisksFiles:是指要注册的文件;[SourceDisksFiles]SRQ24Ctl.ocx=1[RegisterFiles]%30%\Windows\SysWOW64\SRQ24Ctl.ocxDestinationDirs:文件安装的目录,SysWoW64是64位操作系统的安装路径;[DestinationDirs]files=30,Windows\SysWOW64files:是指复制到目的路径下的源文件;[files]SRQ24Ctl.ocx=SRQ24Ctl.ocxCryptlib.dll=Cryptlib.dllDAFK.dll=DAFK.dlldaiclib.dll=daiclib.dllDAUK.dll=DAUK.dllDHKEY.dll=DHKEY.dllDKEY.dll=DKEY.dllDSFK.dll=DSFK.dlldtall.dll=dtall.dllDticTokenApi.dll=DticTokenApi.dllDTLog.dll=DTLog.dllGenEccKey.dll=GenEccKey.dllicapi.dll=icapi.dllIcForCsp.dll=IcForCsp.dlllibDADer.dll=libDADer.dlllibeay32.dll=libeay32.dllnodrvkey.dll=nodrvkey.dllpklibv3.dll=pklibv3.dllSM3.dll=SM3.dllstorkey.dll=storkey.dllxcsp_eclib.dll=xcsp_eclib.dllSRQ24Ctl.ocx:是注册控件的详细信息;file-win32-x86中的file是指文件、win32是指windows系统、x86指系统位数;RegisterServer=yes说明该文件自动注册,clsid指文件的注册码;[SRQ24Ctl.ocx]file-win32-x86=thiscabRegisterServer=yesclsid={09AC9B85-5A51-4106-AC35-5B8025A2C18C}DestDir=11FileVersion=3,0,0,0String:指明文件的目的路径;[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>
注:id是唯一标识,codebase指明CAB文件的位置和版本信息,clsid是要注册控件的信息。

3、在后台实现CAB文件下载

@Controllerpublic 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();    }}