1

我正在 Windows 上用 C++ 编写一个 NPAPI 插件。当我的插件被实例化时,我想从我的主应用程序中传递一些私有数据(具体来说,我想向它传递一个指向 C++ 对象的指针)。似乎没有一种机制可以做到这一点。我错过了什么吗?我不能简单地在插件实例中创建我的对象,因为它应该存在于插件实例的范围之外并且即使在插件实例被销毁时仍然存在。

编辑:

我通过 CEF 在 C++ 中使用嵌入式插件。这意味着我的代码本质上是浏览器和插件。显然,这不是标准 NPAPI 插件的行为方式,因此这可能不是 NPAPI 本身所支持的。

4

2 回答 2

2

您不能将 C++ 对象传递给 javascript;您可以做的是传递一个 NPObject,它也是一个 C++ 对象,并通过 NPRuntime 接口公开事物。

有关详细信息,请参阅http://npapi.com/tutorial3

您可能还想查看FireBreath框架,它极大地简化了这样的事情。

编辑:看来我误解了你的问题。您想要的是能够存储链接到插件实例的数据。您需要的是在创建插件时提供给您的 NPP;NPP 有两个成员,ndata(网景数据)和 pdata(插件数据)。pdata 指针由您控制——您可以将其设置为指向您想要的任意值,然后在您想使用它时将其转换回真实类型。当然,请务必将其转换回并在 NPP_Destroy 上将其删除。我通常创建一个结构来保存一些信息。FireBreath 使用它并将所有插件调用发送到插件对象实例中,以便您可以像普通对象一样操作。

来自 FireBreath 的相关代码示例: https ://github.com/firebreath/FireBreath/blob/master/src/NpapiCore/NpapiPluginModule_NPP.cpp#L145

特别注意 NPP_New 和 NPP_Destroy;还要特别注意如何使用 NPP 的 pdata 成员。

这也在http://npapi.com/tutorial2中讨论

于 2011-10-21T20:47:50.640 回答
1

没有办法通过 NPAPI 做到这一点,因为这个概念在 NPAPI 术语中没有意义。即使你破解了传递原始指针的东西,假设一切都在一个进程中运行,所以如果 CEF 切换到 Chromium 设计的多进程方法,破解就会中断。

您最好假装它们是不同的进程,并使用一些非 NPAPI 方法在主应用程序和插件之间共享您需要的内容。

于 2011-10-27T09:19:10.350 回答