【问题标题】:Can not get DOM window using npapi无法使用 npapi 获取 DOM 窗口
【发布时间】:2012-09-14 02:42:00
【问题描述】:

我制作了一个简单的 NPRuntime 插件,它在加载时调用 Javascript 函数。 基于的示例是 seamonkey,它在 Google Chrome 上运行良好,但在 FireFox 上却不行。

我跟踪代码以找出问题所在,并找到了这一行。

NPObject* window;
NPError err = NPN_GetValue(pNPP, NPNVWindowNPObject, &window);
if (!window)
    _log("Can not get DOM window %d", err);

错误返回 NPERR_INVALID_PARAM。

我猜这个简单的例子可能适用于旧版本的 Firefox... 12.0? 13.0? (我不确定)现在我使用的是最新版本的 FireFox 15.0。

我们将不胜感激。

【问题讨论】:

  • 您在生命周期的哪个位置调用它?在什么功能上?
  • @taxilian 在消息泵线程中。我在调用函数和 NPP_SetWindow 中进行了测试,但相同。它返回 NPERR_INVALID_PARAM 并且窗口为空。
  • 消息抽线程?那到底是什么?你只能在主线程上使用 NPP_ 函数......不过,我的第一个猜测是你的 pNPP 很糟糕。信息不足,只能猜测
  • @taxilian 线程会观察队列,其中包含从套接字类接收到的消息。如果队列有对象,线程立即执行那些行(NPN_GetValue,NPN_Evaluate)。当浏览器句柄传递给插件时,我打印了 pNPP 的地址,它是相同的地址。 NPN_Function 也应该在主线程中调用?抱歉英语不好:(
  • @taxilian 哎呀。你是对的。我在主线程中调用 NPN_GetValue,它返回成功。但是,我真正想做的是在另一个线程中调用 javascript。如何制作?

标签: c++ c npapi npruntime


【解决方案1】:

所以看起来你真正的问题是关于如何从另一个线程调用 javascript 东西,因为你不能从其他线程进行 NPN_ 调用。简短的回答是你不能;更长、更复杂的答案是,这很痛苦,但可以做到。

NPAPI 有一个名为NPN_PluginThreadAsyncCall 的函数。它接受两个参数;第一个是返回 void 并接受 void* 的函数指针,第二个是将传递给该函数的 void*。您可以从任何线程调用此函数,它会导致您的回调“很快”在主线程上被回调。

诀窍是确保您的 void* 为您提供您需要的所有数据,以便在通话期间返回您需要访问的任何内容。如果你需要的话,更大的技巧是让它看起来是同步的。第一个可以用指针完成,并确保你自己清理;第二个可以用互斥锁和信号来完成,如果你够聪明的话。

这是一件棘手且难以做到的事情。如果可以选择,您可以考虑使用FireBreath,因为它会为您完成所有这些工作。特别是因为 FireBreath 为不支持 NPN_PluginThreadAsyncCall 的各种随机浏览器提供了解决方法(如某些版本的 Opera 和 Safari 5.1 及更高版本)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2018-09-12
    相关资源
    最近更新 更多