1

在 javascript 对象上,我正在调用 obj.requestFileSystem(LOCAL,5*1024*1024) 。此方法在 PlainNAPI 插件中实现,现在我必须将一个成功回调传递给此函数,如下所示......

obj.requestFileSystem(LOCAL,5*1024*1024,initFS); // initFS 是 javascript 中的一个函数,它是成功回调的参数。在 NPAPI 中,当 requestFileSystem 完成时它是一个对象,然后应该调用 javascript 中的 initFS 函数。如何从 NPAPI 插件返回到 javascript 并执行 initFS 函数。

function initFS(fs) {
alert('Inside the initFS');
alert(fs.root.getFullPath);
}
4

1 回答 1

2

请不要告诉我你实际上在用这个插件做什么,因为它听起来类似于让人们从网络浏览器访问很容易被其他人滥用的东西。

基本上,当一个函数到达 NPRuntime 中的函数时,它只是一个 NPObject;要调用该函数,您只需对该 NPObject 执行 NPN_InvokeDefault。

请注意,您必须在主线程上才能调用几乎所有 NPN_ 函数。


编辑:因此,如果您必须从不同的线程进行回调,那么您最简单的解决方案是使用NPN_PluginThreadAsyncCall;基本上,您创建一个对象来保存您需要的数据并使用该指针作为 void* 参数调用 PluginThreadAsyncCall,它将传递给您指定的函数。

确保 A) 指针仍然有效,并且 B) 您的函数能够在运行后释放该内存。从回调函数中,您可以安全地调用 NPN_InvokeDefault。

并不是说NPN_PluginThreadAsyncCall似乎不再适用于 Safari 5.1。如果您需要这种支持,或者如果我解释的内容没有意义,您可能需要考虑使用FireBreath来构建您的插件;它为您完成所有这些工作。

于 2012-09-05T21:53:19.617 回答