jiaofeng601, +479html
9人支持,来自Meteor、猪爪、hanyuxinting更多 、是非黑白 、Yuan Xulei、hyolin、Andy Zhao、mangodream浏览器
本文经过多图组合,详细引导初学者开发NPAPI的浏览器插件。bash
如需测试开发完成的插件请参考http://mozilla.com.cn/kb/dev/A.88/app
1. 准备工做函数
开发工具工具
本例使用的是visual studio 2008 英文版,下图是关于信息oop
Windows SDK开发工具
本例使用Windows7操做系统 这里下载SDK测试
NPAPISDKspa
本例使用的是Firefox4.0.1提供的SDK。
首先,从这里下载mozilla源码。而后,解压firefox-4.0.1.source.tar.bz2文件。
将 \firefox-4.0.1.source\mozilla-2.0\modules\plugin 目录解压缩出来,里面有咱们开发NPAPI插件所需的全部资源。
为了方便你们使用,--这里--提供plugin.rar的下载。
本例将plugin目标解压到D:\code\下(后面统一使用绝对路径,以免异意)
2. 建立Plugin
本着“有图有真相”的原则,下面将连续多图并配文字一步步建立、调试Plugin。图中画红圈的表明须要填写或者须要选择的地方。
建立项目
新建项目
Name项必定要以np开头,为了未来适应不一样操做系统,最好全小写,不要太长,尽可能控制在8字符内。
本例定义为npdemo
Location项定义到plugin\sdk\samples以便项目属性中用相对路径引用NPAPI的SDK
本例定义为d:\code\plugin\sdk\samples
向导
选择Application type为DLL
选择Empty project
添加文件
首先,添加NPAPI SDK中的Common文件
一共3个文件
而后,添加def文件
命名最好与项目一致
编辑npdemo.def为
1
2
3
4
5
6
|
LIBRARY
"npdemo"
EXPORTS
NP_GetEntryPoints @1
NP_Initialize @2
NP_Shutdown @3
|
如今,添加资源
选择Version
自动生成了resource.h和npdemo.rc。因为要在版本信息中加项,因此手工npdemo.rc
选择“Y”
在图中的BLOCK中添加。注意!BLOCK 必定要是"040904e4"
VALUE "MIMEType", "application/demo-plugin"
这里顺便说一下,MIMEType是plugin的惟一标示,须要本身定义
一般的格式是"application/“+ [plugin name]
本例中定义为"application/demo-plugin"
下图是rc文件数据项与plugin数据项(about:plugins 中)的对应关系
下面添加最关键的部分:Plugin实现类
类名能够随便起,本例命名为CPlugin
可是必定要继承自nsPluginInstanceBace
修改Plugin.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#pragma once
#include "pluginbase.h"
class
CPlugin :
public
nsPluginInstanceBase
{
private
:
NPP m_pNPInstance;
NPBool m_bInitialized;
public
:
CPlugin(NPP pNPInstance);
~CPlugin();
NPBool init(NPWindow* pNPWindow) { m_bInitialized = TRUE;
return
TRUE;}
void
shut() { m_bInitialized = FALSE; }
NPBool isInitialized() {
return
m_bInitialized; }
};
|
修改Plugin.cpp
其中实现了4个全局函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include "plugin.h"
////// functions /////////
NPError NS_PluginInitialize()
{
return
NPERR_NO_ERROR;
}
void
NS_PluginShutdown()
{
}
nsPluginInstanceBase * NS_NewPluginInstance(nsPluginCreateData * aCreateDataStruct)
{
if
(!aCreateDataStruct)
return
NULL;
CPlugin * plugin =
new
CPlugin(aCreateDataStruct->instance);
return
plugin;
}
void
NS_DestroyPluginInstance(nsPluginInstanceBase * aPlugin)
{
if
(aPlugin)
delete
(CPlugin *)aPlugin;
}
////// CPlugin /////////
CPlugin::CPlugin(NPP pNPInstance) : nsPluginInstanceBase(),
m_pNPInstance(pNPInstance),
m_bInitialized(FALSE)
{
}
CPlugin::~CPlugin()
{
}
|
修改项目属性
打开项目属性
修改字符集设置为“Use Multi-Byte Character Set”
添加搜索目录 “....\include”和“........\base\public”
添加预编译宏 X86
如今能够编译了!
三、注册、测试
本例编译后,在D:\code\plugin\sdk\samples\npdemo\Debug生成npdemo.dll
打开注册表,在HKEY_CURRENT_USER\SOFTWARE\MozillaPlugins下新建子项@mozilla.com.cn/demo
并新建字符串数据“Path”设值为D:\code\plugin\sdk\samples\npdemo\Debug\npdemo.dll
打开火狐浏览器 在地址栏输入“about:plugins” 若是在plugin列表中有本例的npdemo.dll及说明咱们的plugin示例已经成功完成
简单的测试页面:
1
2
3
4
5
6
7
|
<
HTML
>
<
HEAD
>
</
HEAD
>
<
BODY
>
<
embed
type
=
"application/demo-plugin"
>
</
BODY
>
</
HTML
>
|
特别注意
若是在实际部署中使用安装文件安装plugin,并用注册表的方式注册。那么就不须要重启火狐,只要在页面中执行 navigator.plugins.refresh(false); 而后刷新页面便可使用刚安装的plugin