让Chrome/Firefox轻松兼容老旧的ActiveX,让访问硬件外设变得更友好

因为不常来,所以无法及时回复,看到很多人需要交流,请加QQ群:1041052470【JS调用ActiveX解决方案】

同学公司的医院系统是B/S架构的,之前为了兼容各种二代证读卡器(神思、握奇、精纶等)、IC卡读卡器(明华等)、还有各地神奇的健康卡,还有一个奇葩的ActiveX打印控件Lodop,还要支持汉王手写板签名,还要兼容客户的Windows XP,还要照顾前端的js框架......,为了兼容这一切的一切,不得不禁锢在IE8,然而,依然是各种的不兼容,不稳定,不方便......

本着让世界变得更美好的高尚信念,我帮他们设计了一套解决方案,并帮他们开发了出来,运行多时,还算稳定。

下面,就把系统实现原理和思路简单聊聊:

首先是,解决ActiveX兼容的问题。因为Chrome/Firefox不再支持XPCOM架构,所以写一个浏览器插件来解决这个问题并不是一个可行思路。所以,我用Delphi写一个单独的容器进程调用IE内核来运行各种ActiveX,然后开http接口来和Chrome/Firefox交互,我们暂时给这个容器进程起名叫WebAdapter,里面分别定义二代证、IC卡、健康卡等各种接口,每种接口把硬件类型传递过去。Chrome/Firefox端可以通过JSONP/XMLHttpRequest/WebSocket三种方式来通讯了。

XMLHttpRequest接口通讯是这个样子的:

让Chrome/Firefox轻松兼容老旧的ActiveX,让访问硬件外设变得更友好_第1张图片

然后,WebAdapter根据接口名getIdCardInfo调用相应的js文件进行后续处理:

让Chrome/Firefox轻松兼容老旧的ActiveX,让访问硬件外设变得更友好_第2张图片

getIdCardInfo.js中有同名函数,调用,然后进行根据硬件类型的type参数,再调用getIdCardObj()和getIdCardData()进行硬件的访问和数据的包装,看代码:

让Chrome/Firefox轻松兼容老旧的ActiveX,让访问硬件外设变得更友好_第3张图片

用js调用ActiveX:

让Chrome/Firefox轻松兼容老旧的ActiveX,让访问硬件外设变得更友好_第4张图片

 并把不同硬件厂商的数据包装成统一的格式返回:

让Chrome/Firefox轻松兼容老旧的ActiveX,让访问硬件外设变得更友好_第5张图片

返回的数据:

嗯,大概就是这个意思了,文字不够,代码来凑。

配合一个定制的Chrome内核的浏览器,功能更强。

时间不够了,今天先到这里吧,哈哈

 

 

你可能感兴趣的:(软件技术)