如何使用命令调用cNPAPI调用OCX-CSDN论坛

后使用快捷导航没有帐号?
npapi 怎么调用已经开发好的activex,使其activex能在firefox下使用
本人是npapi的新手,我用mfc的activex控件开发了一个控件,但是只能在ie内核下使用,在网上看见可以通过npapi实现跨ie内核使用,请问该怎么做呢?我是新手
用npapi的接口重新封装一下就可以了
按照网上的这个教程,编译的时候出了一堆的错误,是不是要先配置环境变量,然后才能编译,如果要先配置环境,该怎么弄呢,看了MDN的说明,不是很明了&
回复 zlandme: 理论上是&
回复 jiaofeng601: 你的意思是得做两套了?ie内核一套?非ie内核一套了?&
回复 zlandme: 不能直接调用activex,需要重新封装。把里面的逻辑代码分离出来,重新封装对外接口&
大哥,能给个例子吗?我昨天晚上看了下npapi的例子,但不知道怎么通过npapi调用activex&
你做的怎么样?做好了吗?能给我QQ吗?我遇到相同的问题。
.cn/post/21666/ 需要重新开发。&
**** 作者被禁止或删除 内容自动屏蔽 ****
你好,我现在已经照着例子调试出了npapi的add功能和getversion功能,但是如何调用一个OCX插件呢?这个例子中没有解释,现在看firefox的SDK也是晕晕的,不知道该从什么地方入手NPAPI插件开发学习:实现非IE浏览器的类似ActiveX的本地程序(插件)调用 - CSDN博客
NPAPI插件开发学习:实现非IE浏览器的类似ActiveX的本地程序(插件)调用
转载CSDN博友的一篇文章,方便以后学习。
转载地址:
一.Netscape Plugin Interface(NPAPI)
大致的说明可以看下官方文档
本文主要针对于javascript与插件交互部分做一些交流,比如用于数字证书的操作(淘宝和支付宝的插件),用于播放的flash player插件等
与javascript的交互需要用到NPAPI中的npruntime&
下面的部分将以示例的方式说明整个过程如何去实现
在开始前需要从火狐浏览器源代码中获取接口头文件
下载后在\firefox-4.0.1.source\mozilla-2.0\modules\plugin可以找到一些samples和头文件
这里为方便下载,上传了一份
另外,基于NPAPI的一个跨浏览器插件开发的框架FireBreath,非常容易上手而且据说跨浏览器的支持非常好,但是非常笨重,有些功能不需要的也不太容易去掉
,有兴趣的可以去了解下也可以作为基于NPAPI开发的一些参考
还有一个基于NPAPI做的简单的示例,结构非常简单,不用绕来绕去,相对理解起来也简单许多
二.插件入门开发的示例&
开发工具为visual studio 2010
1.新建一个Win32 project,命名以np开头(目的是编译完的Dll名必须以np开头才能被识别为插件)
类型为一个DLL的空工程即可
2.右键选中项目的属性,在VC++ Directories目录下,选择Include Directories,Edit,
将plugin/base/public和plugin/sdk/samples/include添加到include
3.新建Version资源文件
需要注意的是Block 必须为,MIMEType为最后引用插件的标志
4.新建一个Module-Definition File(.def),定义入口函数
5.新建一个CPlugin类继承nsPluginInstanceBase,作为插件实例类(后面再说该类的作用)
确定之后,在plugin.h中#include &pluginbase.h&
类名为Cplugin,头文件名为plugin.h,(npp_gate.cpp会使用到,不同可以修改)
修改构造函数的实现,带参数NPP类型并新建一个属性保存该参数
实现父类的三个纯虚函数
6.免得做过多操作,从samples中引入已经编写好的入口函数
从plugin\sdk\samples\npruntime路径添加np_entry.cpp(插件入口函数),npn_gate.cpp(插件调用浏览器的一些方法),npp_gate.cpp(浏览器调用插件的一些方法)
添加后需要做一点修改,
1).np_entry.cpp和npn_gate.cpp的引用
#include &npapi.h&
#include &npfunctions.h&
#include&pluginbase.h&
2).然后进入pluginbase.h,再进入npplat.h,将
#ifdef XP_WIN
#include &windows.h&
#include &npapi.h&
#include &npfunctions.h&
3).然后在项目属性,Preprocessor,Preprocessor Definitions添加XP_WIN的定义
(这样做的原因是windows.h需要在npapi.h前定义,自己在所有引用了npapi.h的前面加上windows.h的引用也可以)
4),np_entry.cpp中引入头文件#include &stddef.h&
因为使用到offsetof
这三个文件中的函数非常重要,首先来看下np_entry.cpp中的函数
NP_GetEntryPoints函数,为插件入口的函数,插件初始化将会首先调用该函数
该函数用于初始化浏览器调用插件的函数表,以NPP(np plugin)开头,
后面的插件的一些事件(new等)发生时将会以这里初始化的函数作为入口,比如
&pFuncs-&newp & & & & &= NPP_N初始化后将会在创建插件实例时调用NPP_New的实现来创建.
NP_Initialize函数,初始化插件时,在NP_GetEntryPoints后调用,
该函数用于初始化插件调用浏览器的函数表,参数pFuncs带有该函数表信息,
我们自定义一个对象保存这些信息,今后就可通过该对象调用方法来实现对浏览器的一些操作
NP_Shutdown函数,与NP_Initialize对应,主要释放资源等操作
再来看下npp_gate.cpp,这个文件中的函数都以NPP开头,用于定义浏览器调用插件的方法
经过NP_GetEntryPoints的初始化后,当特定事件发生时,浏览器将会调用这些方法
然后需要注意的是该文件引用了plugin.h,是我们第5步创建的文件,名字不同可以改改
NPP_New方法,用于创建插件实例
CPlugin * pPlugin = new CPlugin(instance);这句话为创建一个我们定义的CPlugin类对象,构造函数为NPP类型
NPP_Destroy方法,用于销毁插件实例,刷新页面,关闭页面等操作会触发
该方法会调用CPlugin的shut方法再delete掉实例
NPP_SetWindow方法,插件窗口发生任何变化都会调用该方法
window创建时会调用一次,如果初始化失败则delete掉实例然后返回错误
NPP_GetValue方法,当获取插件有关的一些信息时会触发该方法调用(如获取插件名,插件实例)
当javascript操作插件对象时,该方法调用CPlugin的GetScriptableObject方法,需要自己实现,返回一个脚本操作对象(NPObject)
在这里返回到CPlugin类,添加GetScriptableObject方法并实现(见第7步操作)
NPP_HandleEvent方法,处理事件,该方法调用CPlugin的handleEvent方法,继续添加实现吧
该文件中其他方法暂时没什么可说的,需要用到的可以查下API并实现出来就行了.
再看下npn_gate.cpp,该文件实现了对浏览器的一些操作的函数,都以NPN(np netscape)开头
其中有一些带有NPObject*参数的与GetScriptableObject方法创建的脚本操作对象有关,将在第7步做说明
该文件中用到的NPNetscapeFuncs NPNF在NP_Initialize中初始化完成
7.封装一个脚本操作对象
Add一个C++类,该示例命名为PluginObject,继承NPObject
添加静态方法,用于创建该脚本操作的对象
在PluginObject.h中声明一个NPClass对象,使用上面的静态方法将该NPClass对象初始化
回到第6步中在CPlugin类中实现的GetScriptableObject方法
在该方法中通过NPNCreateObject方法创建该对象
this-&instance在构造函数时获取并保存下来的NPP对象.
NPN_CreateObject会在浏览器中做一些操作然后回来调用objectClass中的_allocate方法
需要实现该静态方法,new 一个PluginObject
新建一个NPP npp属性,和一个NPP参数的构造函数
后面的操作中,浏览器调用了NPNFunc中以上的一些方法则会来调用这些静态方法,并将_allocate返回的值作为参数传到其他函数中
接下来的实现就相对比较随意了,可以直接在这些静态方法中实现想要的效果,
也可以在PluginObject中创建对应的成员函数实现,然后在静态方法中通过nobj参数转换为(PluginObject)类型调用相应成员函数
其中几个函数比较重要,_hasMethod判断参见是否有该函数,_getProperty则是判断属性,invoke调用相应方法,
invokeDefault可以在invoke中调用NPN_InvokeDefault来访问,最好不要直接调用,(见API,原因未知,一般浏览器都要做进一步操作)
hasMethod等方法的类似于参数methodName都是以identifier作为判断的,可以调用NPN_GetStringIdentifier获取
多说下enumerate方法或者说是NPN_XXX的方法,因为就这个东西折腾我完完整整的两天时间...
enumerate方法的参数有个指针数组,但是他的结构是
而且初始化的时候一定要用NPN_MemAlloc来操作....API上只有关于指针数组的结构说明,而且很简单的提了一句,折腾两天才发现非得用NPN来分配内存- -||
弱弱的总结下,应该是需要给Firefox用到的东西或者说从参数传进来需要你分配内存的都得用NPN_MemAlloc分配内存
如果出现Access Violation,首先想到什么地方应该用NPN_MemAlloc....
测试的时候在firebug的控制台输入 plugin. 就会去调用enumerate了
三.注册及安装
1.注册表注册位置
HKEY_CURRENT_USER\Software\MozillaPlugins
添加一个项@/npTest
添加字符串值
&Description&=&code project test&
&Path&=&path to&npTest.dll&
&ProductName&=&npdemo Dynamic Library&
&Vendor&=&zsy&
&Version&=&1.0.0.1&
添加子项MIMETypes
添加MIMETypes的子项application/x-npTest
但是实际上只需要一个项@/npTest以及一个Path字符串值,其他可有可无
在firefox地址栏输入about:plugins可查到你的插件了
2.使用安装文件注册
visual studio新建一个set up project
FileSystem View中选中dll或者某个工程的输出
Registry View中按照上面的位置给添加上相应信息即可
四.使用插件
其中embed的src和pluginspage可有可无
五.调试插件
先前一直弄错了,以为是指向Firefox.exe,查了好久,发现原来在Firefox4之后新建了一个plugin-container.exe进程
调试目标指向plugin-container.exe 或者 tools-&attach to process选中plugin-container.exe进程 或者debug-&attach to process
六.附上示例工程
打开工程后需要修改include directory
------------------------------------------------------分割线-----------------------------------------------------
发现个新问题,NPAPI执行函数返回值不支持带中文的么?
调试很多次了,也不知道是配置问题还是什么问题,NPVariant *result中带有值返回的
但是到浏览器就变成空字符串,去掉中文的就能正常显示
Firebreath的也试过了,也不支持中文字符
没办法,只好将返回的值转成base64再在浏览器解码,这样倒是可以正常
------------------------------------------------------分割线-----------------------------------------------------
firefox新版本 弹出winform(例如访问某些智能卡私钥会需要输入PIN)的时候导致假死的情况,在火狐社区提问了,能够解决
大致意思就是修改config里面的dom.ipc.plugins.enabled.your-plugin.dll=false
本文已收录于以下专栏:
相关文章推荐
一.Netscape Plugin Interface(NPAPI)
大致的说明可以看下官方文档Plugin
本文主要针对于javascript与插件交互部分做一些交流,比如用于数字证书的操作(淘...
一.Netscape Plugin Interface(NPAPI)
大致的说明可以看下官方文档Plugin
本文主要针对于javascript与插件交互部分做一些交流,比如用于数字证书的...
转http://blog.csdn.net/hzzhoushaoyu/article/details/7387516
目录(?)[+]
利用NPAPI开发浏览器插件过程中,发现自己开发的插件调用了多个第三方dll动态库文件。起初按照火狐社区中的方法只在注册表中添加了自己开发的dll文件,未将第三方的...
利用NPAPI开发浏览器插件过程中,发现自己开发的插件调用了多个第三方dll动态库文件。起初按照火狐社区中的方法只在注册表中添加了自己开发的dll文件,未将第三方的dll文件进行注册,浏览器每次加载测...
利用NPAPI开发浏览器插件过程中,发现自己开发的插件调用了多个第三方dll动态库文件。起初按照火狐社区中的方法只在注册表中添加了自己开发的dll文件,未将第三方的dll文件进行注册,浏览器每次加载测...
最近正在学习NPAPI插件的开发,现转载博友的文章如下,供学习参考
原文链接:.cn/post/21666/
本文通过多图组合,详细引导初学者开发N...
之前在一个B/S项目中遇到一个需求,就是客户需要在页面上对报表的布局以及显示内容,进行自定义。最后决定使用activex技术来实现。众所周知,activex是微软搞得,因此只有ie内核的浏览器才能支持...
之前在一个B/S项目中遇到一个需求,就是客户需要在页面上对报表的布局以及显示内容,进行自定义。最后决定使用activex技术来实现。众所周知,activex是微软搞得,因此只有ie内核的浏览器才能支持...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)NPAPI——实现非IE浏览器的类似ActiveX的本地程序(插件)调用 - CSDN博客
NPAPI——实现非IE浏览器的类似ActiveX的本地程序(插件)调用
一.Netscape Plugin Interface(NPAPI)
大致的说明可以看下官方文档
本文主要针对于javascript与插件交互部分做一些交流,比如用于数字证书的操作(淘宝和支付宝的插件),用于播放的flash player插件等
与javascript的交互需要用到NPAPI中的npruntime&
下面的部分将以示例的方式说明整个过程如何去实现
在开始前需要从火狐浏览器源代码中获取接口头文件
下载后在\firefox-4.0.1.source\mozilla-2.0\modules\plugin可以找到一些samples和头文件
这里为方便下载,上传了一份
另外,基于NPAPI的一个跨浏览器插件开发的框架FireBreath,非常容易上手而且据说跨浏览器的支持非常好,但是非常笨重,有些功能不需要的也不太容易去掉
,有兴趣的可以去了解下也可以作为基于NPAPI开发的一些参考
还有一个基于NPAPI做的简单的示例,结构非常简单,不用绕来绕去,相对理解起来也简单许多
二.插件入门开发的示例&
开发工具为visual studio 2010
1.新建一个Win32 project,命名以np开头(目的是编译完的Dll名必须以np开头才能被识别为插件)
类型为一个DLL的空工程即可
2.右键选中项目的属性,在VC++ Directories目录下,选择Include Directories,Edit,
将plugin/base/public和plugin/sdk/samples/include添加到include
3.新建Version资源文件
需要注意的是Block 必须为,MIMEType为最后引用插件的标志
4.新建一个Module-Definition File(.def),定义入口函数
5.新建一个CPlugin类继承nsPluginInstanceBase,作为插件实例类(后面再说该类的作用)
确定之后,在plugin.h中#include &pluginbase.h&
类名为Cplugin,头文件名为plugin.h,(npp_gate.cpp会使用到,不同可以修改)
修改构造函数的实现,带参数NPP类型并新建一个属性保存该参数
实现父类的三个纯虚函数
6.免得做过多操作,从samples中引入已经编写好的入口函数
从plugin\sdk\samples\npruntime路径添加np_entry.cpp(插件入口函数),npn_gate.cpp(插件调用浏览器的一些方法),npp_gate.cpp(浏览器调用插件的一些方法)
添加后需要做一点修改,
1).np_entry.cpp和npn_gate.cpp的引用
#include &npapi.h&
#include &npfunctions.h&
#include&pluginbase.h&
2).然后进入pluginbase.h,再进入npplat.h,将
#ifdef XP_WIN
#include &windows.h&
#include &npapi.h&
#include &npfunctions.h&
3).然后在项目属性,Preprocessor,Preprocessor Definitions添加XP_WIN的定义
(这样做的原因是windows.h需要在npapi.h前定义,自己在所有引用了npapi.h的前面加上windows.h的引用也可以)
4),np_entry.cpp中引入头文件#include &stddef.h&
因为使用到offsetof
这三个文件中的函数非常重要,首先来看下np_entry.cpp中的函数
NP_GetEntryPoints函数,为插件入口的函数,插件初始化将会首先调用该函数
该函数用于初始化浏览器调用插件的函数表,以NPP(np plugin)开头,
后面的插件的一些事件(new等)发生时将会以这里初始化的函数作为入口,比如
&pFuncs-&newp & & & & &= NPP_N初始化后将会在创建插件实例时调用NPP_New的实现来创建.
NP_Initialize函数,初始化插件时,在NP_GetEntryPoints后调用,
该函数用于初始化插件调用浏览器的函数表,参数pFuncs带有该函数表信息,
我们自定义一个对象保存这些信息,今后就可通过该对象调用方法来实现对浏览器的一些操作
NP_Shutdown函数,与NP_Initialize对应,主要释放资源等操作
再来看下npp_gate.cpp,这个文件中的函数都以NPP开头,用于定义浏览器调用插件的方法
经过NP_GetEntryPoints的初始化后,当特定事件发生时,浏览器将会调用这些方法
然后需要注意的是该文件引用了plugin.h,是我们第5步创建的文件,名字不同可以改改
NPP_New方法,用于创建插件实例
CPlugin * pPlugin = new CPlugin(instance);这句话为创建一个我们定义的CPlugin类对象,构造函数为NPP类型
NPP_Destroy方法,用于销毁插件实例,刷新页面,关闭页面等操作会触发
该方法会调用CPlugin的shut方法再delete掉实例
NPP_SetWindow方法,插件窗口发生任何变化都会调用该方法
window创建时会调用一次,如果初始化失败则delete掉实例然后返回错误
NPP_GetValue方法,当获取插件有关的一些信息时会触发该方法调用(如获取插件名,插件实例)
当javascript操作插件对象时,该方法调用CPlugin的GetScriptableObject方法,需要自己实现,返回一个脚本操作对象(NPObject)
在这里返回到CPlugin类,添加GetScriptableObject方法并实现(见第7步操作)
NPP_HandleEvent方法,处理事件,该方法调用CPlugin的handleEvent方法,继续添加实现吧
该文件中其他方法暂时没什么可说的,需要用到的可以查下API并实现出来就行了.
再看下npn_gate.cpp,该文件实现了对浏览器的一些操作的函数,都以NPN(np netscape)开头
其中有一些带有NPObject*参数的与GetScriptableObject方法创建的脚本操作对象有关,将在第7步做说明
该文件中用到的NPNetscapeFuncs NPNF在NP_Initialize中初始化完成
7.封装一个脚本操作对象
Add一个C++类,该示例命名为PluginObject,继承NPObject
添加静态方法,用于创建该脚本操作的对象
在PluginObject.h中声明一个NPClass对象,使用上面的静态方法将该NPClass对象初始化
回到第6步中在CPlugin类中实现的GetScriptableObject方法
在该方法中通过NPNCreateObject方法创建该对象
this-&instance在构造函数时获取并保存下来的NPP对象.
NPN_CreateObject会在浏览器中做一些操作然后回来调用objectClass中的_allocate方法
需要实现该静态方法,new 一个PluginObject
新建一个NPP npp属性,和一个NPP参数的构造函数
后面的操作中,浏览器调用了NPNFunc中以上的一些方法则会来调用这些静态方法,并将_allocate返回的值作为参数传到其他函数中
接下来的实现就相对比较随意了,可以直接在这些静态方法中实现想要的效果,
也可以在PluginObject中创建对应的成员函数实现,然后在静态方法中通过nobj参数转换为(PluginObject)类型调用相应成员函数
其中几个函数比较重要,_hasMethod判断参见是否有该函数,_getProperty则是判断属性,invoke调用相应方法,
invokeDefault可以在invoke中调用NPN_InvokeDefault来访问,最好不要直接调用,(见API,原因未知,一般浏览器都要做进一步操作)
hasMethod等方法的类似于参数methodName都是以identifier作为判断的,可以调用NPN_GetStringIdentifier获取
多说下enumerate方法或者说是NPN_XXX的方法,因为就这个东西折腾我完完整整的两天时间...
enumerate方法的参数有个指针数组,但是他的结构是
而且初始化的时候一定要用NPN_MemAlloc来操作....API上只有关于指针数组的结构说明,而且很简单的提了一句,折腾两天才发现非得用NPN来分配内存- -||
弱弱的总结下,应该是需要给Firefox用到的东西或者说从参数传进来需要你分配内存的都得用NPN_MemAlloc分配内存
如果出现Access Violation,首先想到什么地方应该用NPN_MemAlloc....
测试的时候在firebug的控制台输入 plugin. 就会去调用enumerate了
三.注册及安装
1.注册表注册位置
HKEY_CURRENT_USER\Software\MozillaPlugins
添加一个项@/npTest
添加字符串值
&Description&=&code project test&
&Path&=&path to&npTest.dll&
&ProductName&=&npdemo Dynamic Library&
&Vendor&=&zsy&
&Version&=&1.0.0.1&
添加子项MIMETypes
添加MIMETypes的子项application/x-npTest
但是实际上只需要一个项@/npTest以及一个Path字符串值,其他可有可无
在firefox地址栏输入about:plugins可查到你的插件了
2.使用安装文件注册
visual studio新建一个set up project
FileSystem View中选中dll或者某个工程的输出
Registry View中按照上面的位置给添加上相应信息即可
四.使用插件
其中embed的src和pluginspage可有可无
五.调试插件
先前一直弄错了,以为是指向Firefox.exe,查了好久,发现原来在Firefox4之后新建了一个plugin-container.exe进程
调试目标指向plugin-container.exe 或者 tools-&attach to process选中plugin-container.exe进程 或者debug-&attach to process
六.附上示例工程
打开工程后需要修改include directory
------------------------------------------------------分割线-----------------------------------------------------
发现个新问题,NPAPI执行函数返回值不支持带中文的么?
调试很多次了,也不知道是配置问题还是什么问题,NPVariant *result中带有值返回的
但是到浏览器就变成空字符串,去掉中文的就能正常显示
Firebreath的也试过了,也不支持中文字符
没办法,只好将返回的值转成base64再在浏览器解码,这样倒是可以正常
------------------------------------------------------分割线-----------------------------------------------------
firefox新版本 弹出winform(例如访问某些智能卡私钥会需要输入PIN)的时候导致假死的情况,在火狐社区提问了,能够解决
大致意思就是修改config里面的dom.ipc.plugins.enabled.your-plugin.dll=false
转载地址:http://blog.csdn.net/hzzhoushaoyu/article/details/7387516
本文已收录于以下专栏:
相关文章推荐
http://www.firebreath.org/display/documentation/FireBreath+Home  跨浏览器的插件开发框架,兼容ActiveX 和 NPAPI
2761人阅读 评论(1)
NPAPI是电脑上大部分非i...
浏览器插件总体可以划分为两大阵营,即IE支持的插件以及非IE支持的插件。
本来在Netscape时代,对于浏览器插件是有公用的规范的(NPAPI),一开始所有浏览器都支持该规范,包括IE。后来出于商业...
一.Netscape Plugin Interface(NPAPI)
大致的说明可以看下官方文档Plugin
本文主要针对于javascript与插件交互部分做一些交流,比如用于数字证书的操作(淘...
转http://blog.csdn.net/hzzhoushaoyu/article/details/7387516
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)网页调用OCX方法 - CSDN博客
网页调用OCX方法
1、注册OCX
&&&& 方法:在开始-运行 中输入regsvr32& OCX绝对地址,
&&&& 例如:regsvr32& C:/Windows/System32/aaa.ocx
2、参照下面的代码在HTML页写出代码
&OBJECT&& id=Test&& classid="clsid:90ED08BD-05B6-4CC8-BE14-AC"&& codebase="./aaa.ocx#version=1,0,0,0"&& type="application/x-oleobject"&&&&&&&&& style="LEFT: 0 TOP: 0display:none"&&/OBJECT&
&input type="button" value="功能" name="B" onClick="test()"&
&script language="javascript" type=""&
function test() {& Test.test(0);}
本文已收录于以下专栏:
相关文章推荐
OCX注册方法:1、在开发机上注册OCX      方法:在开始-运行 中输入regsvr32  OCX绝对地址,     例如:regsvr32  C:/Windows/System32/FOMAU...
这里简单介绍如何在网页中调用ocx控件,以及简单解释下网页源码的意思,对于入门的同学可以解决一些最基本的疑惑,我当时在实现的时候都源码都不知道什么意思,所以碰到问题总司云里雾里,了解了这些基本概念对于...
最近准备开发一个b/s架构的应用程序需要用到activeX控件,web服务器尚未进入编码阶段,偶手上已有原用于vc客户端程序中的ocx控件,想测试一下此控件在普通网页上执行功能有无偏差,于是搞了个简单...
vs2008添加ocx对外方法给web调用
首先是ocx插件添加方法
这里在_DAnEdit 而不是它下边那个。右键添加方法,这里添加了
CHAR CAnEditCtrl::SayHel...
Html页中如何使用加载OCX控件详解
第一步 注册OCX控件
得到ocx空间后,首先要添加注册,最简单的 新建reg.txt文件。
在txt里添加RegSvr32  Te...
在HTML页面中使用ActiveX控件包含三个基本操作:将控件放入HTML中;将该控件下载给用户;在用户机器上安装该控件。如果只是针对IE用户,在HTML中插入ActiveX控件就比较简单;如果同时兼...
最近项目中使用ActiveX控件,记录几个知识点,以备忘。
1、页面调用ActiveX,写法
注:貌似标签写在里面不能识别,待确认。
ActiveX需要安装注册后才能使用,客户...
classid=&clsid:-DC5A-47C7-9E8B-& id=&SoftPhone& name=&SoftPhone& height=&0& widt...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)NPAPI插件开发 - CSDN博客
NPAPI插件开发
1.插件是什么
插件是一种遵循一定规范的应用程序接口编写出来的程序。插件必须依附于一个宿主程序,为宿主程序提供增强功能。插件的种类有很多,这里主要讨论浏览器插件。
IE下利用和技术开发的浏览器插件称为控件。一般以为扩展名。浏览器通过标准与控件之间进行交互,完成对现有功能的扩充。
IE和技术都是微软出的,所以如果在非浏览器下开发插件,就不能使用现有的技术标准。技术提供了一种新的开发浏览器下插件的标准。浏览器和插件共同遵守这一标准,完成功能和交互。
2.Netscape插件
支持标准的浏览器有很多,这里以为例进行说明,不同的浏览器在具体的实现上可能有所不同。
Netscape插件是遵循标准开发出的对浏览器扩展的插件模块。&&在下,将插件放入安装目录下的文件夹中,启动,浏览器会通过插件的属性识别出该插件。可以在地址栏中输入来查看插件是否被正确识别,也可以通过设置注册表的方式来安装该插件,可以创建HKEY_LOCAL_MACHINE\Software\\MozillaPlugins\\@/xxxx,添加Path字符串项保存插件路径。浏览器会自动加载。
3.MimeType
Mimetype,媒体资源类型,一般用于设定某种扩展名的文件用一种应用程序打开的方式。在编写Netscape插件时,在资源文件中设置该插件的MimeType属性值。如:
VALUE &CompanyName&, &?????&
VALUE &FileDescription&, &TODO: &File description&&
VALUE &FileVersion&, &1.0.0.1&
VALUE &InternalName&, &npplugins.dll&
VALUE &LegalCopyright&, &TODO: (c) &Company name&.
All rights reserved.&
VALUE &OriginalFilename&, &npplugins.dll&
VALUE &ProductName&, &????&
VALUE &ProductVersion&, &1.0.0.1&
VALUE &MIMEType&, &application/test-plugins&
当浏览器启动后,会在默认的文件夹中加载插件,并读取插件的属性,并保存到浏览器内部。输入即可以获取所有当前识别出的插件已经属性。当浏览器加载页面遇到这样的文件内容时,即知道应该调用属性值为的插件来打开该文件。就会在浏览器中查找到该插件,并进行加载和初始化。如果不存在该属性的插件,则因为找不到指定类型的插件而无法打开该媒体文件。
微软的浏览器下的控件遵循了标准,所以使用标签的CLSID来标识应该调用那个插件来读取该文件,不需要为插件设定MIME&的编码。
4.Netscape插件的生命周期
1.打开浏览器。主动读取安装目录下的文件夹,读取该文件夹下的插件的信息,比如,并保存起来,输入可以查看
2.载入相关页面。当遇到标签为这样的文件内容时,浏览器主动查找加载相匹配的插件。加载的过程也是初始化调用接口的过程。初始化完毕后,浏览器会调用插件相关接口创建一个插件实例,与该页面相关联。
3..载入另一个新的页面。如果已经有页面载入,则此后的所有重新打开的页面都将跳过插件初始化这一步骤,不过要创建新的插件实例与新的页面相对应。
4..关闭一个页面。销毁与该页面关联的插件实例,如果是最后一个页面,则执行反初始化插件操作。
5.&NPAPI标准的接口说明
NPAPI标准定义在一组包含了数据结构和接口函数的头文件中。在实际的开发中,需要将这些头文件加入到工程中,并对头文件定义的部分接口编写实现。用到的主要四个头文件有,,,,这四个头文件可以在的源码例子插件中找到,同时还提供了一组编写的框架用来更方便的开发插件。
简单介绍一下三类接口函数
1..前缀是的插件库提供给浏览器的最上层的接口,一般为动态链接库的导出接口,主要有NP_GetEntryPoints、NP_Initialize、NP_GetMIMEDescription、&NP_GetValue、NP_Shutdown的等几个函数,不同平台的接口可能略有不同,但基本功能都是一样的,都是通过接口来初始化、销毁以及认知此动态库.&
&npplugins&
Explicit exports can go here
NP_GetEntryPoints
NP_Initialize
NP_Shutdown
2.&前缀即是插件本身提供给浏览器调用的接口,主要被用来填充的结构体,主要包括:、、、、、、、、、、、、、等,详细介绍
NPP_Destroy 删除插件的一个运行实例(instance)
NPP_DestroyStream 告知插件将要删除一个流数据
NPP_GetValue 供浏览器查询插件的内部信息
NP_GetValue 供浏览器查询插件的内部信息
NPP_HandleEvent 注册关心的事件,当事件发生时浏览会通知插件
NP_Initialize 只调用一次,在插件加载时调用
NPP_New 创建插件的一个实例
NPP_NewStream 通知插件实例出现了新的流数据
NPP_Print 请求嵌入式打印还是全屏打印
NPP_SetValue 插件添加变量信息
NPP_SetWindow 当窗口创建、移动、改变大小或者销毁时通知插件
NP_Shutdown 销毁插件,与NP_Initialize对应
NPP_StreamAsFile 为数据流提供一个本地文件名
NPP_URLNotify 插件要求通知后,当对于某个URL的请求完成后,浏览器通知插件
NPP_Write 插件读取流数据
NPP_WriteReady 调用NPP_Write之前调用,确实插件可以接收多少字节的数据
3.前缀NPN_XXX类接口一般为浏览器引擎提供给plugin调用的接口主要包括NPN_GetURL、NPN_PostURL、NPN_GetValue、NPN_SetValue、NPN_Status等
当浏览器开始加载插件时,首先调用NP_GetEntryPoint函数用于获取NPP_类函数的地址,为后续调用做初始化工作。接着调用NP_Initialize函数,将浏览器提供的函数地址通知插件。以上两个动态库导出接口完成了插件后续调用和被调用的初始化工作。当所有插件相关页面退出时,浏览器调用NP_Shutdown来完成反初始化。
接下来当加载页面时,浏览器调用插件的函数来创建一个插件实例。当页面退出时,浏览器调用NPP_Destroy来销毁插件实例。注意,只有在第一次加载页面时才会初始化调用插件,后续打开的页面不再重新初始化,因为在第一次初始化时浏览器已经获取了函数接口信息,后续的页面只需要调用创建新的插件实例与页面对应即可。同理,只有当最后一个页面退出时,才调用插件的反初始化,即NP_Shutdown函数。这时,浏览器会清除该插件的对象实例,释放资源。
6.NPAPI的主要数据结构
1.&结构NPPluginFuncs:包含了NPP_函数地址的结构体。浏览器中定义一个这样的结构体对象,通过NP_GetEntryPoint函数对该结构体对象赋值,将NPP_函数地址通知浏览器,供浏览器后续调用
2.&结构NPNetscapeFuncs:包含了浏览器中定义的NPN_函数的结构体。插件中定义一个这样的结构体指针,浏览器通过NP_Initialize函数赋值给这个结构体指针,为后续插件调用浏览器中的这些接口服务。
3.&结构NPObject:包含NPClass&*_class和uint32_t&referenceCount.&插件实例对象
4.&结构NPClass:&包含了访问插件的一组方法。包含在NPObject对象中。主要包含的函数有pluginHasMethod&:询问插件是否支持某一方法。:询问插件是否具有某一属性&pluginInvoke&:当插件支持该方法时,浏览器调用给方法传递参数和获取返回值。
5.&结构NPVariant:带类型定义的数据信息结构&
typedef&struct&_NPVariant&{
&&&&NPVariantType&
&&&&union&{
&&&&&&&&bool&boolV
&&&&&&&&int32_t&intV
&&&&&&&&double&doubleV
&&&&&&&&NPString&stringV
&&&&&&&&NPObject&*objectV
对该结构体的访问可以通过以下的标准宏进行:
NPVARIANT_IS_STRING或者NPVARIANT_TO_BOOLEAN,NPVARIANT_TO_INT32,NPVARIANT_TO_DOUBLE,NPVARIANT_TO_STRING,NPVARIANT_TO_OBJECT等。
NPAPI接口同时提供了一些将其他类型转换为NPVariant结构的宏。如INT32_TO_NPVARIANT,STRINGZ_TO_NPVARIANT,OBJECT_TO_NPVARIANT等,可以很方便的进行数据转换。
7.插件与的交互
NPAPI标准提供了一套插件与的交互机制。
1.&javascript调用插件方法
浏览器首先会调用取得对象的地址。参数为。在取得该对象后浏览器就可以调用插件提供的函数。最主要的函数有下面几个
pluginHasMethod&:询问插件是否支持某一方法。
pluginHasProperty&:询问插件是否具有某一属性
pluginInvoke&:&&&&&当插件支持某一方法时,浏览器将会调用该函数执行插件为提供的这一方法。那么对于提供的很多方法插件如何在该函数内区分。分析这个函数:
pluginInvoke(NPObject&*obj,&NPIdentifier&name,&const&NPVariant&*args,&uint32_t&argCount,&NPVariant&*result);
obj是插件里的对象地址。
Name表示插件提供方法的名字,通过对比这个参数来区分插件提供的不同方法。
args和分别表示传来的参数地址和参数个数。
result是函数返回给的结果。
2.&插件调用js内部的回调函数:
Js可以通过种方式为插件设置回调函数。示例如下:
&script&language=javascript&
Plugin.Onfun&=&//方式一&&通过设置插件属性传入回调函数地址
Plugin.Onfun(fun);//方式二&&&通过调用插件函数传入回调函数地址
Function&fun(){}
在插件内部,当函数地址传到插件时,浏览器把它封装为一个对象,里面存有函数地址
方式一在插件内部,浏览器会调用确认插件是否有该属性。如果有然后浏览器调用函数。的第二个参数判断是哪个属性,第三个参数就是对象地址。
方式二在插件内部,浏览器会调用确定是否支持该方法。然后调用,这里面的参数包含了回调函数地址。
js设置完回调函数后,插件就可以调用该函数了。需要使用,示例代码如下
bool&bret&=&gBrowser-&invokeDefault(npp,&callbackNPObject,&&pV,&1,&&result);
另外,插件也可以直接调用中的函数。在插件内部调用浏览器的函数。具体格式如下
gBrowser-&geturl(inst(),&“javascript:function()”,&&_self&);
如果想传入整数参数,上面函数第二个参数应写成。
如果传入字符串参数,上面函数第二个参数为。如果字符串含有中文,需要进行。
8.开发Netscape插件的一般方法
尽管开发netscape插件有不少可用框架。但是开发一个典型的插件主要要做的工作有以下:
1.编写一个动态链接库。&插件的表现形式就是一个动态链接库,所以首先编写一个文件或者文件供浏览器调用。注意,插件的名称应该以开头,标准的默认规则。
2.添加导出接口。&在文件中添加的导出函数,如图
上面导出了三个函数,供浏览器调用。这三个函数的作用前面已经说过,不再细述
3.添加插件的。首先为插件添加一个文件,注意该资源文件的默认语言应该是英文,简体中文的话浏览器识别不出,然后在文件中添加属性。
4.实现中声明的函数。
5.在中将函数地址赋值给传出参数。
6..在中保存传入的NPNetscapeFuncs对象指针,供插件后续调用
7.在中处理反初始化操作。
8.对NPClass中的函数进行实现
本文已收录于以下专栏:
相关文章推荐
为什么这还是入门呢?因为前面的我们什么都没学会,只是学会了建立一个dll项目,并生成了一个Firefox可以识别dll,在测试页面中不会弹出需要下载插件的错误。而任何功能都没有实现。所以这里才是真正的...
最近项目中需要我编写跨平台的浏览器控件供JavaScript调用,经过几天折腾,我的插件已经能够很好的工作在Windows、Linux、Mac平台上的主流浏览器上,和JavaScript也可以很好的进...
一、编译runtime
 1、Download SDK:
   ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/4.0.1/sou...
1 约瑟夫环问题描述:
约瑟夫环问题是循环链表的经典应用:具体描述如下:n 个人围成一个圆圈,首先第 1 个人从 1 开始一个人一个人顺时针报数,报到第 m 个人,令其出列。然后再从下一 个人开始从 ...
1 循环链表的定义
将单链表中最后一个数据元素的next指针指向第一个元素,如下图所示:
                            
Struct(结构体)的声明、定义及初始化
       上一篇里我们讲了为什么我们要引入Struct这个数据类型,我们了解到Struct是一种聚合数据类型,是为了用户描述和解释一些事物的方便而...
什么是数据对齐?简单的说就是数据的起始地址必须是对齐值的整数倍。
为什么要数据对齐?为了提高存取变量的效率。字节是内存空间分配的最小单位, 在程序中,我们定义的变量可以放在任何位置。其实不同架构 的...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 如何使用视频调用代码 的文章

 

随机推荐