2013-01-12 97 views
1

是否有可能在同一個dll中創建兩個不同的插件,一個用於通信,另一個用作畫布?是否有可能在同一個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字符串,但它非常慢。

回答

3

是的,你可以有一個單一的DLL與多個「插件」。實際上它只是一個插件,但它可以處理多個mimetypes。如果你看看FBTestPlugin的例子,你會發現它實際上處理了三種不同的mimetypes。這些插件可以有選擇地共享相同的JSAPI接口,但它們都在同一個內存空間中,所以你可以(小心!)使用全局變量來共享信息。

假設你的「canvas」對象是你自己的插件的一個實例,你可以使用某種標識符和全局映射來傳遞一個值給另一個插件實例,告訴它使用哪個內存塊等。不能通過javascript將JSAPI對象從一個對象傳遞給另一個對象,並獲取原始C++對象(至少在所有情況下都不會),但是您可以傳遞標識符以便您找到所需的內容。

您可以在firebreath repo in the FBTestPlugin project中找到有關如何執行多種mimetype支持的注意事項。我也會在這裏發佈它們,不過有可能這些細節稍後可能會改變。


改性原始FBTestPlugin如下支持多個MIME類型 在單一的代碼庫:

  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參數。取決於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中的測試代碼以測試多個mimetypes。創建 三個插件,並使用全部三個測試數學函數。

+0

非常感謝,但我真的不明白的「世界地圖」,你的意思是一個std ::地圖並將它傳遞給Canvas類的構造函數註冊它的自我? – user1748906

+0

否; JSAPI實例需要是每個實例。但是,你可以使用std :: map和其他東西。全球手段使其成爲全球變數 – taxilian

相關問題