0

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

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

2:给子dll传递一个指向我的类函数的指针,得到同样的结果。

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

4

1 回答 1

0

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

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

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

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

希望有帮助

于 2012-05-17T04:03:19.903 回答