1

是否可以在同一个 dll 中创建两个不同的插件,一个用于通信,另一个用作画布?

我知道我可以在同一个班级中做到这一点,但我希望第一个是无窗口的(每个浏览器只需要一个),另一个是窗口的(我可以在同一个浏览器中创建最多 4 个)。

我希望能够在它们之间进行选择,就像这样。

<object id="plugin0" type="application/x-communication" width="0" height="0">
<param name="onload1" value="pluginLoaded" />

<object id="plugin1" type="application/x-canvas" width="320" height="240">
<param name="onload2" value="pluginLoaded" />

我可以使用 FB::DOM 从通信对象动态创建画布对象并获取 JSAPIAUTO 指针以直接在它们之间传递二进制数据吗?

NpAPI 不支持字节数组,我尝试使用 base64 字符串,但速度很慢。

4

1 回答 1

3

是的,您可以拥有一个带有多个“插件”的 DLL。实际上它只是一个插件,但它可以处理多种 mimetype。如果您查看 FBTestPlugin 示例,您会发现它实际上处理了三种不同的 mimetype。这些插件可以选择共享相同的 JSAPI 接口,但它们都在相同的内存空间中,因此您可以(小心!)使用全局变量来共享信息。

假设您的“画布”对象是您自己的插件的实例,您可以使用某种标识符和全局映射将值传递给另一个插件实例,以告诉它要使用哪个内存块等。您不能通过通过 javascript 将 JSAPI 对象从一个对象传递到另一个对象并取回原始 C++ 对象(至少不是在所有情况下),但您可以传递标识符,让您找到所需的内容。

您可以在 FBTestPlugin 项目的 firebreath 存储库中找到有关如何支持多种 mimetype的说明。我也会在这里发布它们,尽管其中一些细节可能会在以后发生变化。


修改原始 FBTestPlugin 如下,以支持单个代码库中的多个 mimetype:

  1. 编辑 PluginConfig.cmake,为以下条目添加多个条目:FBSTRING_MIMEType、ACTIVEX_PROGID、FBControl_GUID 和 FBSTRING_PluginDescription。确保为所有条目提供唯一值,包括 FBControl_GUID 中的 GUID。

  2. 编辑 Factory.cpp,修改 PluginFactory::createPlugin() 并添加代码以检查 mimetype 并创建适当的对象。还将“mimetype”作为参数添加到“boost::make_shared(mimetype)”。新代码可以构造“标准”FBTestPlugin 插件,或者从 FBTestPlugin 或 FBTestMathPlugin C++ 对象构建新的“SimpleMath”插件。

  3. 在 FBTestPlugin.h 中,修改 FBTestPlugin 构造函数以将“const std::string& mimetype”作为参数。添加“std::string m_mimetype;” 作为 FBTestPlugin 的私有变量。

  4. 在 FBTestPlugin.cpp 中,修改 FBTestPlugin 构造函数以将“const std::string& mimetype”作为参数并从 mimetype 参数设置 m_mimetype。根据 mimetype 修改 createJSAPI() 以返回“boost::make_shared(m_host)”而不是“boost::make_shared(FB::ptr_cast(shared_from_this()), m_host)”。包括“SimpleMath.h”。根据 mimetype 修改绘图代码中的插件文本,以便向用户提供视觉反馈。

  5. 修改 SimpleMathAPI.h 和 SimpleMathAPI.cpp 以添加“self”属性和“GetSelf()”方法,两者都返回 shared_from_this()。

  6. 将 FBTestPlugin.* 复制到 FBTestMathPlugin.* 并更改对象名称。通过删除 LeakFinder 来简化 FBTestMathPlugin。修改 createJSAPI() 以仅返回 SimpleMathAPI 对象。修改绘图代码中的插件文本,以便向用户提供视觉反馈。

  7. 修改 test.html 中的测试代码以测试多种 mimetype。创建三个插件,并使用这三个插件测试数学函数。

于 2013-01-12T19:28:25.377 回答