我正在Windows上用C ++编写NPAPI插件。当我的插件被实例化时,我想从我的主应用程序传递一些私有数据(具体来说,我想传递一个指向C ++对象的指针)。似乎没有一种机制可以做到这一点。我错过了什么吗?我不能简单地在插件实例中创建我的对象,因为它意味着存在于插件实例范围之外,并且即使在插件实例被销毁时仍然存在。
修改
我正在通过CEF在C ++中使用嵌入式插件。这意味着我的代码本质上是浏览器和插件。显然,这不是标准NPAPI插件的行为方式,因此这可能不是NPAPI本身所支持的。
答案 0 :(得分:2)
你不能将C ++对象传递给javascript;你可以做的是传递一个NPObject,它也是一个C ++对象,并通过NPRuntime接口公开。
有关详细信息,请参阅http://npapi.com/tutorial3。
您可能还想查看FireBreath框架,这大大简化了这样的事情。
修改:我似乎误解了你的问题。您想要的是能够存储链接到插件实例的数据。你需要的是你的插件创建时给你的NPP; NPP有两个成员,ndata(netscape数据)和pdata(插件数据)。 pdata指针是您可以控制的 - 您可以将其设置为指向您想要的任意值,然后在您想要使用它时将其强制转换回实际类型。当然,请务必将其丢弃并在NPP_Destroy上删除。我通常会创建一个结构来保存其中的一些信息。 FireBreath使用它并将所有插件调用发送到Plugin对象实例中,这样您就可以将其视为普通对象。
FireBreath的相关代码示例: https://github.com/firebreath/FireBreath/blob/master/src/NpapiCore/NpapiPluginModule_NPP.cpp#L145
特别注意NPP_New和NPP_Destroy;还要特别注意如何使用NPP的pdata成员。
中也对此进行了讨论答案 1 :(得分:1)
通过NPAPI无法做到这一点,因为这个概念在NPAPI术语中没有意义。即使你破解通过原始指针的东西,也就是假设一切都在一个进程中运行,所以如果CEF切换到多进程方法Chromium是围绕设计的,那么黑客就会破坏。
你最好假装它们是不同的进程,并使用一些非NPAPI方法在主应用程序和插件之间共享你需要的东西。