浏览器插件之ActiveX开发(二)

让ActiveX在FireFox和Chrome等NPAPI插件接口的浏览器中运行 让ActiveX在FireFox和Chrome等NPAPI插件接口的浏览器中上运行 这样firefox浏览器就可以正常浏览有ActiveX插件的网页,比如flash 的ActiveX控件: 在Chrome中,需要按如下方式安装,找到ffactivex的安装目录,新建一个“manifest.json”文本文件,拷贝下列内容后保存: { "name": "ActiveX hosting plugin for Firefox", "version": "1.37.0.0", "description": "ActiveX hosting plugin for Firefox r37", "plugins":[{"path": "npffax.dll", "public": true}] } 在Chrome中点选 扳手 -> 工具 -> 扩展程序 在界面上 点选 载入正在开发的扩展程序 将目录定位到 ffactivex安装目录,确定后即可浏览浏览包含ActiveX插件的网页。 立即下载

原文链接:http://www.cnblogs.com/qguohog/archive/2013/01/23/2873655.html


    按照上文《浏览器插件之ActiveX开发(一)》的步骤,能开发一个基于MFC的简单的ActiveX控件。不过在实际操作中还是会遇到一些问题。由于对COM编程了解得很少很少,有些问题我也没有找到很好的解决方法。

 

     一、ActiveX需要引用其他dll的问题

      我们的ActiveX需要对IC卡设备进行读写,所以需要调用设备自带的接口。设备厂商提供了“mwhrf_bj.lib”、“mwhrf_bj.dll”和“mwrf32.h”等接口文件。将“mwhrf_bj.lib”和“mwrf32.h”添加到项目中,ActiveX的接口方法中就可以调用接口文件中的方法了。但是在编译时会出现“Project:error PRJ0050:未能注册输出。请尝试启用“每个用户的重定向”,或用提升权限从命令提示窗口中注册该组件”或“Project : error PRJ0050: Failed to register output. Please ensure you have the appropriate permissions to modify the registry”的错误。

     实际上该错误不是出现在编辑阶段,而是出现在注册编译后的ocx文件时。Vs.net 2008默认在编译成功后会自动注册编译后的ocx文件。右击项目名称,选择“Properties”,在弹出对话框的“Configurations Properties->Linker->General”中的Register Output就可以配置编译后是否自动注册ocx,如下图所示:

       image

      之所以注册ocx时出错,是因为注册时找不到被调用的“mwhrf_bj.dll”文件。将被调用的“mwhrf_bj.dll”文件放在ocx文件相同目录下或者其他%PATH%路径下(如Windows文件夹或System32文件夹等),则注册ocx时不会报错。在vs.net开发环境中可以直接将要被调用的外部dll文件copy到Debug或Release目录下即可,也可以在PreBuild脚本里将外部dll文件COPY到编译目标文件夹,如:

       image

 

       注:可参考“http://www.cnblogs.com/lidabo/archive/2012/07/16/2593604.html”文章。

 

     二、ActiveX的调试方法

        在Vs.net 2008下可以对ActiveX按如下方式进行调试:

        1、准备好Demo.html文件并写好测试程序,该页面中需通过<object />来引用需测试的ocx控件(关于如何在html页面中调用控件在后续文章将专门提及)。

        2、在vs.net 2008中右击项目名称,选择“Properties”,在弹出框中的Debugging配置页里配置好Command和CommandArgs参数:

            Command:        本地IE浏览器的路径,如“C:\Program Files\Internet Explorer\IEXPLORE.EXE”

            Command Args: 已经创建好的用于测试ocx的html文件路径(如上面提及的Demo.html文件路径)

            image

        3、在程序中需调试的地方设置断点。按F5运行后vs.net将自动启动IE并打开对应的html测试文件,在断点处会中断运行进入调试状态。

 

      三、ActiveX的接口实现out/ref参数及返回自定义结构体数据的问题

     有时候ActiveX的接口方法只返回一个数据并不能满足我们的实际要求。例如通过ActiveX的getPersons()方法返回一堆的人员信息,那必定是一个列表或数组,而且每个Person还包含姓名、性别等各种信息,这个时候返回值就相当复杂了。

     为了简单起见,还是已通过ActiveX进行读卡号来举例。一般情况下,只要该插件提供以下接口即可满足需求:

BSTR ReadCardNo();

     这样在javascript中调用该ActiveX的ReadCardNo()方法即可返回一个包含卡号的字符串。

     但是,仅仅提供这个接口如何来识别读卡过程中出现的异常呢?如果读卡操作一切正常,返回一个卡号字符串当然没有问题。但如果读卡过程中出现诸如读卡设备未正确连接、卡无法识别等情况,如果将这些异常信息反馈给调用者呢?

     1、首先我想到的是使用ref或out参数来解决,对应C++里是OUT/RETVAL之类的参数修饰符。

     在.idl中定义接口为:

      [id(1), helpstring("方法ReadCardNo")] LONG GetSheetName([out]BSTR* cardNo);
     对应接口原型为:

      LONG ReadCardNo( BSTR* cardNo );

     这样的话通过LONG类型的返回值来识别返回状态,例如可以约定:

           0-读卡成功

           1-读卡设备未连接

           2-未找到可识别的卡

           ……

      如果返回值为0,表示读卡成功,读出的卡号已通过out类型的参数cardNo传递给调用者。

      但是,javascript等脚本语言并不支持out/ref等类型的参数,函数参数也无法传址,所以这个方案无法解决我的实际问题。

 

      2、如果ActiveX的接口能返回一个自定义的结构体类型数据就能满足我们的需求了。例如我们定义一个结构体:

          typedef struct

           {

               LONG ResultStatus,              // 返回状态  0-读卡成功  1-读卡设备未连接 3-未找到可识别的卡

               BSTR CardNo                       // 读卡成功时,保存读取的卡号

           } AOPResult;

          对应接口如果可以按如下样子来实现就可以解决我们的问题了:

          AOPResult ReadCardNo();

         但是,在MFC ACtiveX的接口定义中中不能直接使用自定义的数据类型的,需要用VARIANT类型来进行转换。下面几篇参考文章均对此有所描述:

          a) http://bbs.youkuaiyun.com/topics/320146859

          b) http://bbs.youkuaiyun.com/topics/20064135

          c) http://www.codeproject.com/Articles/916/Using-User-Defined-Types-in-COM-ATL

          d) 标准MFC WinSock ActiveX控件开发实例(II)高级篇

          但实现起来也不是那么容易,鉴于时间问题及我们实际需求的不迫切性,我对此没有做过多尝试。如果有成型实例,望请赐教。

       

      3、既然在Web应用场景下ActiveX的接口一般都是供js调用,那么我们可以返回一个json类型的数据即可,如“{ status:0, cardNo:234234344634 }”。这样ActiveX接口仍然只需返回一个BSTR的参数,只是返回值的意义变了,不是简单的卡号,而需要ActiveX的ReadCardNo接口在内部处理时需要将返回值封装成一个json格式的字符串返回并交由调用方解析。不过,在封装json字符串时需要对{、}、:等特殊字符进行相应处理。

 

      4、对于简单的应用场景,我们也完全可以利用ActiveX的属性来化解此类问题。例如我们在ActiveX中定义一个属性CardNo,这样的话提供的接口只用简单的返回一个状态即可:

         LONG ReadCardNo()

       接口返回值仍然表示状态,如0表示读卡成功,1表示未找到读卡设备等等。当返回0时,读卡成功,对应的卡号从属性CardNo中获取即可。

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~

参考资料:

ActiveX Controls( MFC )


=======================================================================
野文(Jasson Qian)
------------------------------------------------------
博客园: http://qguohog.cnblogs.com
优快云: http://blog.youkuaiyun.com/sallay

深圳明华URF R330读卡器 M1卡读写程序 VC6.0.rar 深圳明华URF R330读卡器 M1卡读写程序 VC6.0.rar 是一款来自厂家很不错的源代码, 你可以在此基础再继续开发。 立即下载

相关推荐

火狐支持ActiveX的扩展

1,火狐版本必须是51.0以下,51.0以上我没验证; 2,解压附件,安装multi_browser.exe,安装完成后,可以在火狐地址栏输入about:plugins查看是否成功; 3,如果是在HTML页面调用ActiveX,则注意object的写法,同IE是不一样的。附件callNew.html里有调用举例,注释掉的object是IE写法,没注释掉的是Firefox写法。

让火狐浏览器可以访问含有activex控件网页的三种方式

一:安装一个扩展MediaWrap 0.1.7.3 mediawrap 是一个很小的 Firefox 扩展。它能够将 ActiveX 控件方式的网页内嵌媒体转换成 Firefox 能够支持的 Plugin 方式,从而使 Firefox 也能够象 IE 一样正常播放 Wmplayer、Rmplayer、QtPlayer 和 FlashPlayer 格式的媒体文件。当然,你的系统中首先要安装过相应的...

weixin_34112208的博客 887

游程理论提取灾害事件特征V2---基于MATLAB语言的编程实现

游程理论,灾害事件,MATLAB

EWBA_GIS_RS_ER的博客 3792

浏览器插件之ActiveX开发(二

浏览器插件之ActiveX开发(二)      按照上文《浏览器插件之ActiveX开发(一)》的步骤,能开发一个基于MFC的简单的ActiveX控件。不过在实际操作中还是会遇到一些问题。由于对COM编程了解得很少很少,有些问题我也没有找到很好的解决方法。        一、ActiveX需要引用其他dll的问题       我们的ActiveX需要对IC卡设备进行读写,所以需要调用设

迷茫的小莱 1133

PCIe设备内存访问实战:从ioremap到DMA映射的完整流程解析

本文深入解析了PCIe设备内存访问的完整流程,涵盖从CPU通过ioremap访问设备寄存器,到设备通过DMA映射高效读写主机内存的核心机制。详细探讨了虚拟地址、物理地址与总线地址的转换关系,对比了一致性与流式DMA映射的适用场景及同步要点,并阐述了IOMMU在安全与效率中的作用,为驱动开发者提供了实战代码与关键陷阱分析。

weixin_29201933的博客 505

超详细!动态规划详解分析(典型例题分析和对比,附源码)

为啥要使用动态规划?什么时候使用动态规划?以下是我的一些理解和心得,如果你感兴趣,就接着往下看吧。 对您有帮助的话记得给我点个赞哟! 动态规划的基本思想 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。 动态规划算法与分治法类似,其基本思想也是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中 得到原有问题的解。与分治法不同的是,动态规划经分解后得到的子问题

qq_44398094的博客 8万+

C++浏览器插件ActiveX开发(二)

按照上文《浏览器插件之ActiveX开发(一)》的步骤,能开发一个基于MFC的简单的ActiveX控件。不过在实际操作中还是会遇到一些问题。由于对COM编程了解得很少很少,有些问题我也没有找到很好的解决方法。一、ActiveX需要引用其他dll的问题我们的ActiveX需要对IC卡设备进行读写,所以需要调用设备自带的接口。设备厂商提供了“mwhrf_bj.li...

weixin_34122548的博客 184

【智能优化算法】2024年SCI鳗鱼-石斑鱼优化算法(EGO),含MathType公式、word伪代码、visio流程图、matlab代码等。

该文中包括5个内容:用MathType编辑的公式、伪代码、visio的流程图,matlab代码,PDF论文,拿来直接用,可以帮助科研者省下超多时间。 鳗鱼-石斑鱼优化算法(Eel and grouper optimizer ,EGO)是一种新型的元启发式算法(智能优化算法),灵感来源于海洋生态系统中鳗鱼和石斑鱼的共生作用和觅食策略。该成果由Ali Mohammadzadeh和Seyedali Mirjalili两位作者于2024年6月发表在SCI著名期刊《Cluster Computing》上。

2301_79359347的博客 1041

浏览器插件之C#开发"ActiveX"(二)

接着前一篇所述: 打开网页成功后,但如果想调试这个嵌入的控件,该怎么办呢? 若要调试C#开发的"ActiveX"控件,必须制定一个容器(可执行文件)用于运行控件,有两种方法,一种是使用VS自带的容器进行调试,一种是使用实际的生产环境来调试。这里控件是嵌入到网页中的,所以不能使用VS自带容器调试。 一。在"解决方案资源管理器中"选择项目,右键查看"属性",点击"调试"选项卡, 在启动外部程序

SHIJIERUCIMEIHAO的专栏 1623

Cadence公司的数字IC设计工具:综合工具(Genus)——(2)

介绍Cadence公司的数字IC设计工具Genus

qq_42922513的博客 1943

ESP-IDF 5.4下esp32-camera组件编译报错?手把手教你解决头文件缺失问题

本文详细解析了ESP-IDF 5.4环境下esp32-camera组件编译时出现的头文件缺失问题,提供了从目录结构优化、CMake配置到VSCode智能感知设置的完整解决方案。针对第三方组件集成难题,文章特别强调了PRIV_REQUIRES依赖声明和路径配置的关键作用,帮助开发者高效解决编译错误并建立稳定的开发环境。

weixin_28829629的博客 307

富客户端未来走势

可能是有一段时间不关注技术发展,最近发现新事物很多:Google Chrome脱离Beta版,FireFox3.1采用新TraceMonkey引擎性能大幅提升。Google还准备搞一个Native Client插件。种种迹象表明,客户端开发,即将进入一轮新发展。 04年的时候在公司内部的BBS曾发文,宣称富客户端的到来,目前看,无论是主流网站还是企业应用,都大量通过AJAX技术去改善用户...

灰色地带 206

JVM高频面试基本问题与知识点整理

JVM高频面试基本问题与知识点整理

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 87万+

浏览器插件开发之——NPAPI

 一 浏览器概述    关于什么是浏览器,强大的wiki已经做了比较完善的解释http://en.wikipedia.org/wiki/Web_browser。相关浏览器的比较参考:http://en.wikipedia.org/wiki/Comparison_of_web_browsers#Vulnerabilities    浏览器的核心是layout engine,基本上各浏览器只是包装,主要layout engine参考:http://en.wikipedia.org/wiki/Comparison

自由空间,实现思想的自由之地 7650

用 SAML 2.0 Bearer Assertion 配置 ABAP OAuth 2.0 令牌交换

摘要: SAP系统集成中,身份跨系统传递是关键挑战。OAuth 2.0的SAML 2.0 Bearer Assertion grant机制通过SAML断言换取访问令牌,实现安全身份传递。配置核心在ABAP的SOAUTH2事务码,需绑定可信SAML身份提供商(IdP)并指定访问范围。实际应用中,需确保SSL加密传输,正确配置SAML IdP信任关系,并为OAuth客户端分配专用系统用户。常见问题包括证书不匹配、权限配置不当等,需分层控制权限边界以保障安全。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 834

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IE浏览器插件ActiveX的制作以及Google 调用此插件

奇思妙想

邢美玲 3987

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

浏览器插件之ActiveX开发

浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题。在有特殊需求(如涉及数据安全的金融业务数据交互、需插件才能实现的与本地设备的交互等)的情况下可以酌情慎用。 浏览器插件总体可以划分为两大阵营,即IE支持的插件以及非IE支持的插件。本来在Netscape时代,对于浏览器插件是有公用的规范的(NPAPI),一开始所有浏览器都支持该规范,包括IE。后来出于商业原因,微软的IE不...

anqixing的专栏 411

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IE浏览器安装Activex插件

一、新建项目—&gt;类库,取名:ActiveXDemo 二、右键项目属性:应用属性==&gt;程序集信息=&gt;使程序集Com可见, 生成==&gt;输出==&gt;为com互操作注册;新建接口类取名:IObjectSafety 直接复制代码 using System; using System.Collections.Generic; using System.Linq; using Sy...

你要十分努力,才能看起来毫不费力! 1万+

NPAPI——实现非IE浏览器的类似ActiveX的本地程序(插件)调用

一.Netscape Plugin Interface(NPAPI) 大致的说明可以看下官方文档Plugin 本文主要针对于javascript与插件交互部分做一些交流,比如用于数字证书的操作(淘宝和支付宝的插件),用于播放的flash player插件等 与javascript的交互需要用到NPAPI中的npruntime Scripting plugins 下面的部分将以示例的方式

周绍禹-whuiss 1万+
上一篇: 浏览器插件之ActiveX开发(一)
下一篇: 浏览器插件之ActiveX开发(三)
zzstack
博客等级 码龄15年 12粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值