是否可以在同一个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从通信对象动态创建canvas对象,并获取JSAPIAUTO指针直接在它们之间传递二进制数据吗?
NpAPI不支持字节数组,我尝试使用base64字符串,但速度非常慢。
答案 0 :(得分:3)
是的,您可以拥有一个包含多个“插件”的DLL。实际上它只是一个插件,但它可以处理多个mimetypes。如果你看一下FBTestPlugin的例子,你会发现它实际上处理了三种不同的mimetypes。这些插件可以选择共享相同的JSAPI接口,但它们都在相同的内存空间中,因此您可以(小心!)使用全局变量来共享信息。
假设您的“canvas”对象是您自己插件的一个实例,您可以使用某种标识符和全局映射将值传递给另一个插件实例,以告诉它要使用哪个内存块等。您可以不能通过javascript将JSAPI对象从一个传递到另一个,并获取原始C ++对象(至少在所有情况下都不会),但是您可以传递标识符,以便找到您要查找的内容。
您可以在firebreath repo in the FBTestPlugin project中找到有关如何执行多种mimetype支持的说明。我也会在这里发布它们,虽然有些细节可能会在以后发生变化。
修改原始FBTestPlugin,如下所示,以支持多个mimetypes 在一个代码库中:
编辑PluginConfig.cmake,为以下内容添加多个条目 条目:FBSTRING_MIMEType,ACTIVEX_PROGID,FBControl_GUID和 FBSTRING_PluginDescription。确保为您提供唯一值 所有条目,包括FBControl_GUID中的GUID。
编辑Factory.cpp,修改PluginFactory :: createPlugin()并添加代码 检查mimetype并创建适当的对象。还添加 “mimetype”作为参数 “推动:: make_shared(MIME类型)”。新代码可以构建 “标准”FBTestPlugin插件,或者来自的新“SimpleMath”插件 FBTestPlugin或FBTestMathPlugin C ++对象。
在FBTestPlugin.h中,修改要使用的FBTestPlugin构造函数 “const std :: string&amp; mimetype”作为参数。添加“std :: string m_mimetype;“作为FBTestPlugin的私有变量。
在FBTestPlugin.cpp中,修改要使用的FBTestPlugin构造函数 “const std :: string&amp; mimetype”作为参数并从中设置m_mimetype mimetype参数。修改createJSAPI()以返回 “推动:: make_shared(m_host)” 代替 “boost :: make_shared(FB :: ptr_cast(shared_from_this()),m_host)” 取决于mimetype。包括“SimpleMath.h”。 根据mimetype修改绘图代码中的插件文本,以便向用户提供视觉反馈。
修改SimpleMathAPI.h和SimpleMathAPI.cpp以添加“self”属性 和“GetSelf()”方法,两者都返回shared_from_this()。
将FBTestPlugin。*复制到FBTestMathPlugin。*并更改对象名称。 通过删除LeakFinder简化FBTestMathPlugin。修改 createJSAPI()仅返回SimpleMathAPI对象。修改 插图代码中的插件文本,用于向用户提供视觉反馈。
在test.html中修改了测试代码以测试多个mimetypes。创建 三个插件,并使用这三个插件测试数学函数。