chrome中使用AppEmit调用ocx使用文档,vue调用ocx

chrome中使用AppEmit调用ocx使用文档,vue调用ocx

需求背景

想要在chrome+Vue3项目内调用SDRdCard.ocx神思身份证读取器,因为ocx是IE浏览器内提供的,Vue3不支持IE浏览器。

了解到有安装浏览器插件的方式去实现,但是chrome在2020年12月后不再支持flash(NPAPI),而微软的edge也不支持ActiveX。

所以选了了使用中间件这种方式

  • AppEmit:收费和免费【免费版本,每次启动和第20、40、80...分钟时发消息会有弹窗,不在意的话可以选择】
  • 猿大师:收费

开发步骤

  1. 创建vue3项目

  2. 下载AppEmit

    https://www.appemit.com

  3. 运行AppEmit

    我调用的是SDRdCard.ocx,读取身份证功能,

    • 将SDRdCard.cab解压缩,获得到了 下面几个文件

      shell 复制代码
      Getinfo.dll
      RdCard.dll
      SDRdCard.inf
      SDRdCard.ocx
      termbt.dll
    • 编写安装控件bat命令,将复制文件到系统目录,自行修改下面copy命令将解压后的文件都复制到系统目录

      shell 复制代码
      # 安装控件64位.bat
      cd /d "%~dp0"
      copy  SDRdCard.ocx C:\windows\SysWOW64
      copy  RdCard.dll C:\windows\SysWOW64
      copy  Getinfo.dll C:\windows\SysWOW64
      copy  SDRdCard.dll C:\windows\SysWOW64
      copy  termbt.dll C:\windows\SysWOW64
      
      C:\windows\SysWOW64\regsvr32 SDRdCard.ocx
      
      # 安装控件32位.bat
      cd /d "%~dp0"
      
      copy  SDRdCard.ocx C:\windows\System32
      copy  RdCard.dll C:\windows\System32
      copy  Getinfo.dll C:\windows\System32
      copy  SDRdCard.dll C:\windows\System32
      copy  termbt.dll C:\windows\System32
      
      C:\windows\System32\regsvr32 SDRdCard.ocx
    • 根据系统位数安装执行不同的bat命令 安装控件64位.bat安装控件32位.bat

      注意:bat命令要和要移动的文件[SDRdCard.cab解压缩获得的文件]在相同目录

    • AppEmit根目录放入SDRdCard.ocx文件

    • 双击运行AppEmit.exe文件,首次运行可使用管理员身份运行

  4. 在运行的AppEmit根目录编写index.htm

    html 复制代码
    <html>
    <head>
      <title>身份证读取</title>
    </head>
    <body>
    <OBJECT classid=clsid:F1317711-6BDE-4658-ABAA-39E31D3704D3 width=0 height=0 align="center"
            codebase="SDRdCard.cab#version=1,3,6,4" id="SDRdCardDom" HSPACE=0 VSPACE=0>
    </OBJECT>
    <center><h3> 身份证读取演示 </h3></center>
    
    <input type="button" onclick="javascript:OpenCard()" value="OpenPort" />
    <input type="button" onclick="javascript:readCard()" value="readCard" />
    <br>
    <script language="javascript">
    
      function OpenCard() {
        const openRes = SDRdCardDom.OpenPort(); // SDRdCard内的方法
        alert('OpenPort:' + (openRes == 0 ? '成功' : '失败'))
      }
      function readCard() {
        const readcardRes =SDRdCardDom.readcard();// SDRdCard内的方法
        alert('readcard:' + (readcardRes == 0 ? '成功' : '失败'))
        if (readcardRes == 0) {
          alert('身份证号:' + SDRdCardDom.CardNo)
        }
      }
    </script>
    </body>
    </html>
  5. 编写vue读取组件

html 复制代码
      <template>
        <button @click="resetPage">重新连接</button>
        <div id="AppEmbed1" style="border: solid 2px #F0F0F0; min-width:30px;min-height:20px;width:600px;height:400px" ></div>
      </template>
      <script setup>
      import { onBeforeUnmount, onMounted, ref } from 'vue'
      
      function initAppEmit() {
        // 回调方法-可选
        AE.callbackFunc = [{
          'equ': {
            'service': 'appemit', 'rid': 0, 'clientAuth': 1
          }, 'func': function(res) {
            console.log('✨ websocket连接状态:✨ ', res)
            openPage()
          }
        }]
        // AppEmit默认80端口,可在config.ini内修改
        AE.InitApp('ws://localhost:80/appemit?cid=00000-1&sid=1&flag=1', AE.callbackFunc)
      
      }
      
      // 打开页面
      const openPage = () => {
        const ReqPar = {
          "emit": "open", "Obj": "web", "AppType": 1, "pos": 1, "AppId": 1, "par": {
            "URL": '/index.htm' // *以AppEmit运行目录为根目录,非项目目录*
              , "htmlStr": null
              , "HttpServer_startUrl": null
            	, "embed_object": {//多个object可以设置embed_object为数组
                  "objName": "SDRdCard"
                  , "reg": true    //null 不执行注册   1强制操作 true 未注册则注册  false 卸载注册 (重启AppEmit后,就不能加载dll了)
                  , "asAdmin": 0   //1需要管理员权限注册 0不需要 ,win7管理员身份会有提示确认窗口
                  , "dllFile": "/SDRdCard.ocx" //为了安全,限制为AppEmit文件夹,不能注册或者注销其它文件夹下面的ocx,*所以要将SDRdCard.ocx放在AppEmit运行根目录*
            	}
          }
        };
        AE.OpenApp(ReqPar);
      }
      
      // 重新连接
      function resetPage() {
        AE.CloseApp({}) // 关闭所有
        openPage()
      }
          
      onMounted(() => {
        initAppEmit()
      })
      
      onBeforeUnmount(() => {
        AE.CloseApp({})
      })
      </script>
      <style scoped>
      
      </style>
      ```

      
相关推荐
不想上班只想要钱4 小时前
动态类名在 <swiper-slide 的复制项中没有起作用的解决方法
前端·vue.js
多多*4 小时前
图解Redis的分布式锁的历程 从单机到集群
java·开发语言·javascript·vue.js·spring·tomcat·maven
Mr Xu_5 小时前
Vue + Element Plus 实现前端导出 Excel 功能详解
前端·javascript·vue.js
前端大波5 小时前
vue3的自动化路由(unplugin-vue-router)
javascript·vue.js·自动化
万邦科技Lafite6 小时前
小红书评论数据一键获取,item_reviewAPI接口讲解
大数据·前端·数据库·chrome·电商开放平台
多仔ヾ6 小时前
Vue.js 前端开发实战之 06-Vue 路由
vue.js
meng半颗糖7 小时前
vue3+tpescript 点击按钮跳转新页面直接通过链接预览word
前端·vue.js·word
击败不可能7 小时前
vue做任务工具方法的实现
前端·javascript·vue.js
【赫兹威客】浩哥7 小时前
【赫兹威客】框架模板-前端bat脚本部署教程
前端·vue.js
一 乐8 小时前
学生宿舍管理|基于springboot + vue学生宿舍管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·助农电商系统