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

How to pass C++ object to NPAPI plugin?

本文关键字:NPAPI 插件 对象 C++      更新时间:2023-10-16

我正在Windows上用C++编写一个NPAPI插件。当我的插件被实例化时,我想从我的主应用程序中向它传递一些私有数据(特别是,我想向它传递一个指向C++对象的指针(。似乎没有这样的机制。我是不是错过了什么?我不能简单地在插件实例中创建我的对象,因为它应该存在于插件实例的范围之外,并且即使插件实例被破坏也会持续存在。

编辑:

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

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

请参阅http://npapi.com/tutorial3了解更多信息。

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

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

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

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

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

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

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