1

我正在开发一个 NPAPI 插件,我需要从浏览器的主线程运行一些代码。

NPAPI 插件的线程模型是什么?NPAPI 执行的默认线程是什么?如何从浏览器的主线程运行我的代码?

4

2 回答 2

4

正如 smorgan 所说,浏览器的线程模型是对浏览器的任何调用都必须发生在主线程上。对此有一两个奇怪的例外,但支持有些不一致。

引入NPN_PluginThreadAsyncCall正是为了解决这个问题;它接受一个函数指针和一个 void* 用于将数据传递给它,并将在主线程上调用该函数。当然,这里发生了一些棘手的事情,因为由于固有的竞争条件,如果您在插件关闭期间 调用NPN_PluginThreadAsyncCall ,您不能保证您的函数会被调用。FireBreath做了一些相当奇特的巫术来解决这个问题并防止内存泄漏。

当您开始尝试支持除 FireFox 之外的其他浏览器时,事情会变得更加复杂。AFAIK FireFox 在所有版本中都支持此 API 调用,但至少某些版本的 Safari(尤其是 64 位)不支持 NPN_PluginThreadAsyncCall;最有趣的是,它们有时似乎支持它,但最终会得到一个错误的函数指针,当您尝试使用它时会崩溃。这可能已在最近的版本中修复,我不知道,因为我们很久以前就更改为在 Mac 上使用 NSTimer 以避免无法正确检测是否支持的问题。此外,众所周知,Windows 上的 Opera 不支持它。FireBreath 使用消息 HWND 并执行 PostMessage 在不支持它的 Windows 浏览器上的主线程上进行调用。

我不知道linux上是否存在类似问题;您没有指定您关注的平台。我还没有听说过关于 linux 的任何问题,但这可能意味着也可能没有任何意义。

关于该主题的其他值得一读的问题: Generating async Javascript events from browser plugin (NPAPI) How to callback plugin thread on Safari 5.1 on OSX?

祝你好运

于 2012-12-10T05:26:02.993 回答
2

线程模型是浏览器会在主线程调用你的插件,你必须NPN_*从主线程调用方法。

于 2012-12-09T20:45:30.167 回答