2012-05-16 44 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