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