三、创建实例
初始化之后就可以创建多个实例了。创建实例的时候通过NPN_SetValue 设置有窗口(默认)或没有窗口。
插件实例通过NPP_New 和 NPP_Destroy创建和销毁
NPError NPP_New(NPMIMEType pluginType,
NPP instance, uint16 mode,
int16 argc, char *argn[],
char *argv[], NPSavedData *saved);
NPP_New创建一个MIMEType类型的插件实例,你可以分配一些私有数据。可以将多个 MIME 类型指派给插件, 这可能允许插件响应不同类型的数据流, 具有不同的接口和行为。
参数mode有两个可选值,NP_EMBED或NP_FULL,NP_EMBED和其他内容共享浏览器窗口,NP_FULL看似是一个新窗口。
接下来三个参数可以用一个例子理解:
<embed src="movie.avi" height="100" width="100" loop="true">
argc = 4
argn = { "src", "height", "width", "loop" }
argv = { "movie.avi", "100", "100", "true" }
保存参数允许插件的实例保存其数据, 并且当实例被销毁时, 将数据传递到该插件的下一个 url 实例。数据保存在历史记录列表中。只要该插件仍显示在该列表中, 则保存的数据将与该页关联;任何新实例都接收此数据。(必应翻译厉害)
四、销毁实例
当删除插件实例时, 浏览器调用 NPP_Destroy, 通常是因为用户已经离开了包含实例的页面, 关闭了窗口, 或者退出了应用程序。如果这是由插件创建的最后一个实例, 则调用 NP_Shutdown。(必应翻译)
请务必删除插件实例中存储的任何私有实例特定信息-> pdata。
NPError NPP_Destroy(NPP instance, NPSavedData **save);
该插件可以使用可选的 save 参数来保存数据以供使用相同 url 的新实例重用。数据通过其保存的参数传递给 NPP_New。例如, 视频播放器可以保存要显示的最后一个帧数。当用户返回到该页时, 上一个帧号将传递给插件的新实例, 因此它可以最初显示相同的帧。
请注意, 您不能指望通过这种方式保存数据。如果浏览器重新启动或清除内存, 数据可能会丢失。当 NPP_Destroy 返回时, NPSavedData 结构的 buf 字段的所有权从插件传递到浏览器。
在 NPP_New 中, 保存的参数包含先前保存的该插件实例的数据 (由 NPP_Destroy 保存)。插件必须释放 NPSavedData 的内存和它包含的缓冲区。
在 NPP_Destroy 中, save 参数指定要保存的状态或其他信息, 以便由具有相同 url 的新实例重用。
为了确保在丢弃保存的数据时浏览器不会崩溃或泄漏内存, buf 字段应该是一个分配给 NPN_MemAlloc 的扁平结构 (一个没有分配的子结构的简单构造), 如下面的示例所示:
char* myData = "Here is some saved data.\n";
int32 myLength = strlen(myData) + 1;
*save = (NPSavedData*) NPN_MemAlloc(sizeof(NPSavedData));
(*save)->len = myLength;
(*save)->buf = (void*) NPN_MemAlloc(myLength);
strcpy((*save)->buf, myData);
如果在 NPP_Destroy 中分配已保存的实例数据, 请务必使用此函数分配内存, 因为浏览器可以随时删除与 NPN_MemAlloc 等效的保存数据。(以后就靠必应翻译了!强无敌)