加载DLL和子DLL调用父类

时间:2012-05-16 20:48:41

标签: c++ dll com activex npapi

我有一个加载子dll的ActiveX dll(NPAPI插件)。我的子插件创建了多个线程,他们需要回传到网页。在我的ActiveX(父dll)中,我有连接点来触发javascript事件以提供更新。我遇到的问题是我不知道孩子如何调用父DLL。

我尝试过: 1:将函数指针传递给不在类中的函数的子dll,并使用全局变量作为指向ActiveX类的指针(this),但在使用E_UNEXPECTED调用时连接点失败

2:将子dll传递给我的类函数指针,并得到相同的结果。

我还在同时学习C ++和COM,对不起我的无知。谢谢。

1 个答案:

答案 0 :(得分:0)

COM有办法设置,以便您可以从其他线程调用COM方法,但最简单的方法是将所有调用回到主线程上的activex控件。一种方法是创建一个消息窗口并向其发布一条Windows消息,其中LPARAM是一个指向包含进行调用所需参数的数据结构的指针;你创建结构并填写它,然后发布消息并在你的WINPROC打电话后释放内存。

FireBreath使用这种方法,效果很好。说到这个,您是否考虑过将您的NPAPI插件作为FireBreath插件实现,以便它在activex和npapi中都有效?

以下是一些可能有用的代码示例:

  • WinMessageWindow(.cpp.h) - 这是FireBreath用于创建消息窗口的类;特别注意DefaultWinProc,它用作异步(通常是交叉线程)函数调用的一部分
  • NpapiBrowserHostAsyncWin(.cpp.h) - 这是一些用于某些浏览器的类,用于npapi插件解决NPN_PluginThreadAsyncCall无法正常工作。它利用WinMessageWindow在_scheduleAsyncCall
  • 中进行跨线程调用

希望有所帮助