【问题标题】:How can a DLL access an EXE class?DLL 如何访问 EXE 类?
【发布时间】:2016-11-03 21:05:17
【问题描述】:

我正在做一个项目,我试图将一些组件模块化。其中之一是窗口化。不过,我正在尝试将输入传递回主 EXE,并且我正在通过用户界面函数执行此操作,该函数又调用主输入系统类中的主要方法。后一个类太复杂了,甚至在两个系统上都没有可用的标头(取决于许多类)。

无论如何,实际的问题是我无法访问输入接口类中的任何方法!

class WINDOW_EXPORT_CLASS GameWindow {
private:
    InputInterface *input;
    virtual void SetInputPointer(InputInterface *);
    ...
};

这是在我的 DLL/SO 文件中,我可以访问所有这些。但我无法访问输入的成员。 Bash 因符号查找错误而崩溃:

./bin/window.so: undefined symbol: _ZN14InputInterface16SetMouseInWindowEb

有人对如何解决这个问题有任何想法吗?我的输入接口类头包含在两边。该类包含 void 函数并且不导出(我不知道可以。如果需要导出,请您说明如何?)提前谢谢!

【问题讨论】:

  • 你可能需要一个插件接口。
  • 另一个用户 1201ProgramAlarm 有写答案,但我不太确定你的意思,而且 InputInterface 的标头在可执行文件中,其标头已被引用在可执行文件和 dll 中。使函数虚拟化解决了这个问题。

标签: c++ class methods dll undefined


【解决方案1】:

您可以将要从 DLL 中访问的方法设为虚拟。然后,当您调用一个函数时,将在 vtable(已在 EXE 中设置)中查找该函数,而不是通过导出的符号名称。

这要求 EXE 创建输入对象并将它们传递给 DLL。如果 DLL 需要创建输入对象,则需要从 EXE 中导出因子方法,并在运行时使用 LoadLibrary 等动态定位它。

【讨论】:

  • 确认:将每个功能虚拟化确实有效,谢谢!
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多