NPAPI接口库技术说明文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NPAPI插件技术说明文档
说明:该文档主要说明基于NPAPI标准进行开发浏览器插件的方法和开发环境等的相关说明。

并以简单的例子实现在firefox、Opera和chrome浏览器上测试进行说明。

主要说明原理性的内容。

一、环境说明:
VS2008 + xulrunner-1.9.2.17.en-US.win32.sdk
SDK是firefox提供的,下载地址
/en/docs/Gecko_SDK
需要用到firefox源码中的例子插件的一些源码文件:np_entry.cpp、npn_gate.cpp、
npp_gate.cpp、basic.def、pluginbase.h、npplat.h、plugin.h等文件。

二、函数说明:
NP_是npapi的插件库提供给浏览器的最上层的接口
NPP_即NP Plugin是插件本身提供给浏览器调用的接口,主要被用来填充NPPluginFuncs的结构体
NPN_即NP Netscape ,是浏览器提供给插件使用的接口,这些接口一般都在NPNetscapeFuncs结构体中
1)NP_XXX类函数
NP_XXX类接口一般为动态链接库的导出接口,主要有NP_Initialize、NP_GetMIMEDesc ription、NP_GetEntryPoints、NP_GetValue、NP_Shutdown的等几个函数,不同平台的接口可能略有不同,但基本功能都是一样的,都是通过接口来初始化、销毁以及认知此动态库。

详细的接口介绍请参照:
https:///en/Gecko_Plugin_API_Reference:Plug-in_Side_Plug-in_API
2)NPP_XXX类函数
NPP_XXX类接口一般为提供给浏览器引擎调用的接口,主要包括:
NPP_New、NPP_Destroy、NPP_SetWindow、NPP_GetMIMEDescription、NPP_NewStream、N PP_DestroyStream、NPP_StreamAsFile、NPP_WriteReady、NPP_Write、NPP_Print、NPP_Hand leEvent、NPP_URLNotify、NPP_GetValue、NPP_SetValue等
详细的接口介绍请参照:
https:///en/Gecko_Plugin_API_Reference:Plug-in_Side_Plug-in_API
3)NPN_XXX类函数
NPN_XXX类接口一般为webkit引擎提供给plugin调用的接口主要包括:NPN_GetURL、NPN_PostURL、NPN_RequestRead、NPN_NewStream、NPN_Write、NPN_De stroyStream、NPN_Status、NPN_UserAgent、NPN_MemAlloc、NPN_MemFree、NPN_Me mFlush、NPN_ReloadPlugins、NPN_GetJavaEnv、NPN_GetJavaPeer、NPN_GetURLNotify、NPN_PostURLNotify、NPN_GetValue、NPN_SetValue、NPN_InvalidateRect、NPN_Invalidat eRegion、NPN_ForceRedraw、NPN_GetStringIdentifier、NPN_GetStringIdentifiers、等
详细接口请参照:https:///en/Gecko_Plugin_API_Reference:Browser_Side_Plug-in_AP
I和https:///en/Gecko_Plugin_API_Reference/Scripting_plugins
4)重要函数结构说明
①NPError NPP_New(
NPMIMEType pluginType,
//插件提供给浏览器的识别信息,浏览器解析HTML时根据该表示来调用和加载插件
NPP instance,
//插件实例
uint16 mode,
//插件模式①NP_EMBED:嵌入浏览器页面模式;②NP_FULL:独占页面模式
int16 argc,
//<embed>参数个数
char *argn[],
//<embed>参数名称
char *argv[],
//<embed>参数值
NPSavedData *saved)
//存放一些浏览器发来页面信息,在下次打开同一页面时可以直接使用
{
}
②char* NP_GetMIMEDescription(void)
{
Return(MIME_TYPES_DESCRIPTION);
}
char* NPP_ NP_GetMIMEDescription(void)
{
Return(MIME_TYPES_DESCRIPTION);
}
MIME_TYPES_DESCRIPTION是插件类型,可以指定一个的或多个,一个类型是通常对MIME_TYPES_DESCRIPTION进行宏定义:
#define MIME_TYPES_DESCRIPTION “application(vedio)/basic-plugin:[要处理的文件类型(.avi)]:[name插件名称]”
多个类型是采用直接在return里面并列列出:
③NPError NPP_SetWindow(
NPP instance,
// 当前插件的实例
NPWindow *window);
//指向插件绘制的窗口,包含窗口句柄,宽高左上角左边等信息
④void *NPN_MemAlloc (uint32 size);
void *NPN_MemFree (uint32 size);
用来调用插件时向浏览器申请内存和销毁插件时释放内训
⑤NPError NP_GetValue(
Void * instance,
//指向当前插件实例
NPPVariable variable,
// 两个变量①NPPVpluginNameString:插件名称;②NPPVpluginDescriptionString:插件描述
Void * value)
//上述变量的值
三、插件生命周期
三、简单插件例子
通过添加一个函数来实现在插件绘制的窗口上打印一串字符:
如果调用应用程序能可以直接在插件实例初始化的时候进行调用,可以自己定义函数。

四、关于交互问题(即ScriptablePlugin类型的插件)
1.浏览器调用插件的方法的顺序,基本上为:NP_GetEntryPoints、NP_Initialize、NPP_New、NPP_SetWindow、NPP_GetValue。

2.在NPP_New中,创建插件对象的实例;NPP_SetWindow中,浏览器会传入插件窗口位置及其他的信息;NPP_GetValue函数,是浏览器来获取插件信息的。

3.NPP_GetValue函数的结构是这样的:
NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value);
•instance包含着插件对象实例;
•variable表示浏览器要获取的信息的类型;
•value表示返回给浏览器的值
浏览器传入NPPVpluginScriptableNPObject作为variable参数的值来查询插件是否支持Scriptable功
能(即和脚本语言交互的功能)。

这里可以利用NPN_CreateObject方法来创建一个NPObject对象,并作为value返回给浏览器。

浏览器就通过这个NPObject对象和插件建立连接,当页面上Javascript调用了我们插件对象的某个方法时,浏览器会调用该NPObject对象的HasMethod方法来查询是否支持这个方法,如果支持,则会调用NPObject对象的Invoke 方法,传入方法名、参数等信息,并执行相应的方法功能(方法功能的实现在invoke函数里面,可以添加多个功能方法)。

相关文档
最新文档