NPAPI插件开发详细记录:插件运行流程分析本文详细分析插件的代码是如何执行的,主要分析np_entry.cpp、npn_gate.cpp和npp_gate.cpp.希望能够有所收获。在windows平台下,插件就是一个dll,注意到这个dll的def文件内容是:NPP接口函数可能调用的nsPluginInstanceBase成员函数或全局函数备注NPP_NewNS_NewPluginInstance创建插件实例NPP_DestroyNS_DestroyPluginInstance、plugin->shut删除插件实例NPP_SetWindowplugin->SetWindow、plugin->isInitialized、plugin->init、NS_DestroyPluginInstance窗口创建、移动、改变大小或销毁时调用NPP_NewStreamplugin->NewStream通知插件实例有新的数据流NPP_WriteReadyplugin->WriteReady确定插件是否准备好接收数据(以及其准备接收的最大字节数) NPP_Writeplugin->Write调用以将数据读入插件this might be better named “NPP_DataArrived”NPP_DestroyStreamplugin->DestroyStream通知插件实例数据流将要关闭或销毁NPP_StreamAsFileplugin->StreamAsFile为创建流数据提供本地文件名NPP_Printplugin->Print为嵌入或全屏插件请求平台特定的打印操作NPP_URLNotifyplugin->URLNotify通知插件已完成URL请求NPP_GetValueplugin->GetValue调用以查询插件信息(还用来获取NPObject/Scriptable 插件的实例)NPP_SetValueplugin->SetValue这是用来为浏览器提供插件变量信息的NPP_HandleEventplugin->HandleEvent事件处理函数,对windowed的插件只在MAC操作系统上可用,对于winless的插件所有平台都可用可见,NPP接口基本上与nsPluginInstanceBase类的成员函数一一对应。下面这段文字译自:http://colonelpanic.net/2009/05/building-a-firefox-plugin-part-two/当你明确了插件的生命周期之后会发现它事实上非常简单。初始化入口 NP_Initialize和NP_GetEntryPoints的调用顺序不确定(根据相关文档);但是在实际中,Windows平台上貌似NP_GetEntryPoints 先被调用。记住这一点,下面就是Windows平台上基本的windowed插件初始化的调用顺序:1. NP_GetEntryPoints – 插件用NPP_New, NPP_Destroy, NPP_SetWindow等函数的入口地址填充一个函数表。2. NP_Initialize – 插件存储一个NPN_CreateObject, NPN_MemAlloc,等函数入口地址组成的函数表的拷贝。3. NPP_New – 插件创建一个新的插件实例并初始化4. NPP_SetWindow – 每个实例都会多次调用这个函数——每次实例窗口创建、改变大小或者其他变化都会调用。5. NPP_GetValue (Variable = NPPVpluginScriptableNPObject) – 插件创建一个支持脚本的NPObject并返回其指针(调用NPN_RetainObject)。6. — 标准的插件活动 —7. NPP_Destroy – 销毁插件实例8. NP_Shutdown – 销毁所有遗留的插件资源
NPP接口函数
可能调用的nsPluginInstanceBase成员函数或全局函数
备注
NPP_New
NS_NewPluginInstance
创建插件实例
NPP_Destroy
NS_DestroyPluginInstance、plugin->shut
删除插件实例
NPP_SetWindow
plugin->SetWindow、plugin->isInitialized、plugin->init、NS_DestroyPluginInstance
窗口创建、移动、改变大小或销毁时调用
NPP_NewStream
plugin->NewStream
通知插件实例有新的数据流
NPP_WriteReady
plugin->WriteReady
确定插件是否准备好接收数据(以及其准备接收的最大字节数)
NPP_Write
plugin->Write
调用以将数据读入插件this might be better named “NPP_DataArrived”
NPP_DestroyStream
plugin->DestroyStream
通知插件实例数据流将要关闭或销毁
NPP_StreamAsFile
plugin->StreamAsFile
为创建流数据提供本地文件名
NPP_Print
plugin->Print
为嵌入或全屏插件请求平台特定的打印操作
NPP_URLNotify
plugin->URLNotify
通知插件已完成URL请求
NPP_GetValue
plugin->GetValue
调用以查询插件信息(还用来获取NPObject/Scriptable 插件的实例)
NPP_SetValue
plugin->SetValue
这是用来为浏览器提供插件变量信息的
NPP_HandleEvent
plugin->HandleEvent
事件处理函数,对windowed的插件只在MAC操作系统上可用,对于winless的插件所有平台都可用