2012-05-16 41 views
0

我有一個加載子DLL(NPAPI插件)的ActiveX DLL。我的子插件創建多個線程,他們需要傳回網頁。在我的ActiveX(父DLL),我有連接點觸發事件的JavaScript提供更新。我遇到的問題是我不知道孩子如何調用父DLL。加載DLL和子DLL調用父類

我試過的東西: 1:將函數指針傳遞給不在類中的函數的子dll,並且使用了一個全局變量,該變量是指向ActiveX類(this)的指針,但連接點調用E_UNEXPECTED時失敗

2:將子dll傳遞給我的類函數,並得到相同的結果。

我仍然在學習C++和COM的同時,抱歉我的無知。謝謝。

回答

0

COM有設置方法,以便您可以從其他線程調用COM方法,但最簡單的方法是將所有調用返回到主線程上的activex控件。一種方法是創建一個消息窗口並向其發佈一個窗口消息,LPARAM是一個指向數據結構的指針,該數據結構包含進行調用所需的參數;您創建結構並填寫完畢,然後發佈消息並在您的WINPROC撥打電話後釋放內存。

FireBreath使用這種方法,它工作得很好。說到這一點,您是否考慮過將您的NPAPI插件作爲FireBreath插件實施,以便它可以在activex和npapi中工作?

這裏有一些代碼示例,可以幫助:

  • WinMessageWindow(.cpp.h) - 這是一類FireBreath使用用於創建消息窗口;特別注意它用作一個異步的一部分DefaultWinProc(通常橫紗)函數調用
  • NpapiBrowserHostAsyncWin(.cpp.h) - 這是在某些瀏覽器用於NPAPI插件來解決NPN_PluginThreadAsyncCall不工作的一類。它利用WinMessageWindow進行跨線程調用在_scheduleAsyncCall

希望幫助

+0

也許我應該編輯的問題。我正在嘗試ActiveX調用Javascript函數。 – hapyfishrmn

+0

歡迎您編輯它,但我的答案不會改變;這就是FireBreath在IE上調用Javascript的方式。 – taxilian

+0

我想要ActiveX調用Javascript函數。在我的ActiveX中,我有一個CSample類和一個名爲Fire_Update的類中的連接點(它觸發了js拾取的事件)。只要我在課堂內,我可以調用Fire_Update,但是我的孩子dll會產生線程並需要調用更新。我如何與班級溝通。 – hapyfishrmn