npapi插件开发的阶段性总结

本文详细介绍如何创建并实现一个简单的NPAPI插件,包括项目搭建、资源文件配置、核心接口实现及与浏览器交互等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)  新建命名为npsimple的Win32项目, dll工程, 空项目.


2)  添加npsimple.def文件, 文件内容为:

LIBRARY "npsimple"     

EXPORTS

NP_GetEntryPoints   @1

NP_Initialize               @2

NP_Shutdown           @3


3)  添加资源文件, 新建一个Version资源, 进行如下修改:

    3.1)[BLOCK "080404b0"]修改为[BLOCK "040904e4"]

    3.2)[VALUE "Translation", 0x804, 1200]修改为[VALUE "Translation", 0x409, 1252]

    3.3)[VALUE "ProductVersion", "1, 0, 0, 1"]后面添加一行[VALUE "MIMEType", "application/demo-plugin"], 其中demo-plugin是自己命名的.


4)  添加代码

    4.1)添加下面几个api头文件, 文件内容不可修改:

        npapi.h             ==>

        npfunctions.h  ==>

        npruntime.h    ==>

        nptypes.h        ==>

    4.2)添加下面几个api头文件的实现, 文件内容是自己实现的, 但是格式固定, 通常不用修改:

        np_entry.cpp  ==> 对NP_xxx函数的实现, 这是dll的接口函数

        npn_gate.cpp  ==> 对NPN_xxx函数的实现, 这是浏览器实现的函数, 被插件调用, 被用来填充NPNetscapeFuncs的结构体

        npp_gate.cpp  ==> 对NPP_xxx函数的实现, 这是插件实现的函数, 被浏览器调用, 被用来填充NPPluginFuncs的结构体

        

5)  修改工程配置:

    5.1)[C++ ==> Preprocessor ==> Preprocessor Definitions] 增加_X86_宏

    5.2)[General ==> Charactor Set] 修改为 [Use Multi-Byte Character Set], 经过测试, 这一点不是必要的


6)  编译完成后, 在打开注册表[HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins],

    新建子项[@qihan.cn/npsimple], 

    新建字符串[Path = D:\npsimple\npsimple\npsimple\bin\npsimple.dll],

    打开firefox浏览器, 在地址栏中输入about:plugins, 会打开插件列表, 其中能找到npsimple.dll相关信息.


7)  新建html文件, 增加元素<embed type="application/demo-plugin">, 使用firefox浏览器打开这个文件, 查看插件效果


其他:

1)  中文编码问题.

    从Script带中文参数, 进入npapi, 然后在Script中输出, 没有问题;

    从npapi带中文参数, 在Script中输出, 脚本执行失败.

    

2)  如何在npapi默认窗口中, 建立子级窗口.

答: 本质上npapi生成的dll, 还是一个dll, 所以可以在DllMain中找hInstance, 在pNPWindow中找hwnd


3)  Chrome浏览器对插件识别, 调用失败.

答: Translation的值要和BLOCK匹配


4)  会出现多线程问题吗? 

答: NPN_xxx函数只能在主线程中调用


5)  几个关键接口的调用顺序.

NPP_New               ====> 建立内存时

NPP_SetWindow   ====> 建立窗口时

NPP_GetValue      ====> 设置NPObject对象时

NPP_Destroy        ====> 销毁内存时


6) 与js的交互方法, 主要依赖的是NPObject对象, 该对象的NPClass成员携带的是处理js交互的方法:

NPAllocateFunctionPtr            ==> 生成此NPClass对象的方法

NPDeallocateFunctionPtr       ==> 销毁此NPClass对象的方法

NPHasMethodFunctionPtr      ==> 检查获取的id是否是想要处理的

NPInvokeFunctionPtr               ==> 在上个函数设置为需要处理时, 会调用此函数

NPInvokeDefaultFunctionPtr  ==> 默认被调用的函数

NPHasPropertyFunctionPtr    ==> 

NPGetPropertyFunctionPtr     ==> 

NPSetPropertyFunctionPtr     ==>


7) ..\sdk\samples\npruntime这个工程, 个人认为是最好的示例工程, 哪里找它呢, 哪里呢, 哪里...


参考资料:

http://mozilla.com.cn/post/21666/

http://blog.youkuaiyun.com/z6482/article/details/7664789

https://developer.mozilla.org/en/Gecko_Plugin_API_Reference:Plug-in_Side_Plug-in_API

内容概要:本文档详细介绍了基于事件触发扩展状态观测器(ESO)的分布式非线性车辆队列控制系统的实现。该系统由N+1辆车组成(1个领头车和N个跟随车),每辆车具有非线性动力学模型,考虑了空气阻力、滚动阻力等非线性因素及参数不确定性和外部扰动。通过事件触发ESO估计总扰动,基于动态面控制方法设计分布式控制律,并引入事件触发机制以减少通信和计算负担。系统还包含仿真主循环、结果可视化等功能模块。该实现严格遵循论文所述方法,验证了观测误差有界性、间距误差收敛性等核心结论。 适合人群:具备一定编程基础,对非线性系统控制、事件触发机制、扩展状态观测器等有一定了解的研发人员和研究人员。 使用场景及目标:①研究分布式非线性车辆队列控制系统的理论与实现;②理解事件触发机制如何减少通信和计算负担;③掌握扩展状态观测器在非线性系统中的应用;④学习动态面控制方法的设计与实现。 其他说明:本文档不仅提供了详细的代码实现,还对每个模块进行了深入解析,包括非线性建模优势、ESO核心优势、动态面控制与传统反步法对比、事件触发机制优化等方面。此外,文档还实现了论文中的稳定性分析,通过数值仿真验证了论文的核心结论,确保了系统的稳定性和有效性。建议读者在学习过程中结合代码进行实践,并关注各个模块之间的联系与相互作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值