【问题标题】:How to pass C++ object to NPAPI plugin?如何将 C++ 对象传递给 NPAPI 插件?
【发布时间】:2011-10-21 19:48:41
【问题描述】:

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

编辑:

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

【问题讨论】:

  • 你的“主应用程序”是什么意思。你是说你想从一个已经运行到插件实例的完全独立的应用程序中传递一个对象吗?如果是这样,您的问题没有任何特定于 NPAPI 的内容,因此您可能会更幸运地提出一个关于如何在 Windows 上执行 IPC 的新的、更一般的问题(不提及 NPAPI)。
  • 实际上,从您下面的 cmets 看来,您可能在自己的应用程序中使用 NPAPI 作为插件接口,而不是编写浏览器插件。 NPAPI 旨在用作浏览器插件接口,因此如果您不编写浏览器插件,您的问题是您使用了错误的工具来完成这项工作。
  • 对,很抱歉造成混乱。请参阅上面对我的问题的修改。

标签: c++ windows chromium npapi chromium-embedded


【解决方案1】:

您不能将 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中讨论

【讨论】:

  • 我不想将 C++ 对象传递给 JavaScript;我正在尝试将指向 C++ 对象的指针传递给我的插件,以便可以在 C++ 端的 NPAPI 接口中访问它(例如,如果可能,我想在 NPP_SetWindow 和相关函数中访问它)。对我来说似乎很奇怪,没有(明显的?)方法可以将私有数据传递给我的 NPAPI 插件。
  • 对不起,我误会了;我已经修改了我的答案,希望能更好地回答你的问题。一个建议,如果我可以的话:如果他们只是误解了你,在你给人们机会修改他们的答案之前,不要投反对票。你可能会惹恼他们,以至于他们不会费心回答。另外,如果您按照教程链接环顾四周,您会在教程 2 上找到我的问题的答案;授予大量阅读。我仍然建议您查看 FireBreath 而不是手动操作。
  • 在您发布的示例(NpapiPluginModule_NPP.cpp)中,NpapiDataHolder 在 NPP_New 中实例化并与 pdata 关联。我明白了这一点,但我的问题是我想将一个对象与在插件实例实例化之前创建的 pdata 相关联。换句话说,我希望有一些可用的机制允许我将自己的数据指针传递给 NPP_New。我开始认为我解决这个问题的唯一方法是使用 SetWindowLongPtr 将我的数据指针与窗口句柄相关联;然后我可以在 NPP_SetWindow 中获取该指针。
  • (顺便说一句,感谢您的回答,如果我最初的问题不清楚,我深表歉意。这有点难以解释清楚。:-)
  • 我不确定如何在调用 NPP_New 之前拥有一个插件实例特定的对象;浏览器调用 NPP_New,您无法更改其调用方式。但是,没有什么可以阻止您在某个地方拥有一个可以从插件实例访问的全局对象,或者拥有一个全局映射来将一些 id(您可以从 javascript 等传入)映射到一个对象实例;我想我真的不明白你的问题。有时间访问 npapi.com/chat,我会看看我是否能提供更好的帮助。我是格林威治标准时间 -0600,通常是在工作日的白天,某个周末
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多