如何将C ++对象传递给NPAPI插件?

我正在Windows上用C ++编写一个NPAPI插件。 当我的插件实例化时,我想从我的主应用程序传递一些私人数据(具体来说,我想传递一个指向C ++对象的指针)。 似乎没有这样做的机制。 我错过了什么吗? 我不能简单地在插件实例中创build我的对象,因为它意味着存在于插件实例的范围之外,即使在插件实例被销毁的情况下也是存在的。

编辑:

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

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

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

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

有关更多信息,请参阅http://npapi.com/tutorial3

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

编辑 :似乎我误解了你的问题。 你想要的是能够存储链接到插件实例的数据。 你需要的是当你的插件被创建时给你的NPP。 NPP有两个成员,ndata(netscape data)和pdata(plugin data)。 pdata指针是您自己控制的 – 您可以将其设置为指向您想要的任意值,然后在您要使用它时将其转换回实际类型。 当然,一定要在NPP_Destroy上将其删除。 我通常会创建一个结构来保存一些信息。 FireBreath使用它,并将所有插件调用发送到Plugin对象实例,以便您可以像正常的对象那样操作。

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

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

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