【问题标题】:Loading DLL and child dll calling parent class加载DLL和调用父类的子dll
【发布时间】:2012-05-16 20:48:40
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ dll com activex npapi


    【解决方案1】:

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

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

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

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

    希望有帮助

    【讨论】:

    • 也许我应该编辑这个问题。我正在尝试让 ActiveX 调用 Javascript 函数。
    • 欢迎编辑,但我的回答不会改变;这就是 FireBreath 在 IE 上调用 Javascript 的方式。
    • 我正在尝试让 ActiveX 调用 Javascript 函数。在我的 ActiveX 中,我有一个 CSample 类和一个名为 Fire_Update 的类中的连接点(它会触发 js 拾取的事件)。只要我在课堂上,我就可以调用 Fire_Update,但是我的子 dll 产生了线程并且需要调用更新。我如何与班级交流。
    • 按照我上面提出的建议;当您需要进行函数调用时,您将数据放入一个结构中并向您在任何产生任何线程之前创建的消息窗口发出一条消息。该窗口的 WINPROC 接收消息并进行您想要进行的函数调用。消息将到达主线程,因此从那里进行调用是安全的。
    • 我实现了一个 Message proc,就像您在示例 (WinMessageWindow) 中一样,但无法从静态函数调用连接点事件。我尝试将类的指针保存为全局并尝试调用事件但没有连接。我可能会错过什么?
    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-12-04
    • 2021-05-06
    相关资源
    最近更新 更多