【问题标题】:Overriding classes/functions from a .dll从 .dll 覆盖类/函数
【发布时间】:2010-04-05 03:54:41
【问题描述】:

假设我有 A 类和 B 类。B 继承自 A 类,并实现了一些虚函数。唯一的问题是 B 是在 .dll 中定义的。现在,我有一个返回类 A 实例的函数,但它从 .dll 中返回类 B 实例的静态函数中检索它。我的计划是调用创建的对象,并希望拥有这些函数在 .dll 中执行,而不是在类 A 中定义的函数。出于某种原因,我不断收到受限内存访问错误。有什么我不明白的地方会使这个计划无法实施吗?

【问题讨论】:

  • 相关stackoverflow问题
  • 请提供您的所有代码(或表现出相同问题行为的最小外观)。
  • 跨 DLL 边界使用类的困难是人们仍然使用(不寒而栗)COM 的部分原因。

标签: c++ function virtual overriding dll


【解决方案1】:

C++ 类不能很好地跨越 DLL 边界。 DLL 和 EXE 需要使用完全相同的编译器和版本构建——最好是一起构建。这是因为类实现细节,如vtbl 布局/顺序以及一些标准库功能的实现(即std::string 差异)是不可移植的。不同编译器的名称修饰方案在编译器/版本之间也是不可移植的。您可以在 DLL 边界之外可靠地公开的唯一接口是 C 接口。

因为我不知道这里的确切情况,所以我不能确定,但​​您可能正在跨 DLL 边界调用某种类型的未定义行为。

编辑:DLL 也有可能在某些时候被卸载,导致调用 B 中不存在的代码。

【讨论】:

  • 我自己编译 .dll,我还试图通过确保将函数声明为 c 函数来避免名称修改方案。
  • 听起来问题不在于调用虚函数。如果您发布一些代码,我们可能会给出更好的答案。
  • 我想调用函数不是问题,我发现当我尝试在其中一个虚函数中实例化一个属于 B 类成员的指针时会发生错误。
【解决方案2】:

请参阅我关于此主题的其他广泛问题和答案 - 有帮助吗? How to work (portably) with C++ class hierarchies & dynamic linked libraries

【讨论】:

    【解决方案3】:

    您是否尝试使用 Visual Studio 调试器对其进行调试?

    设置调试器以捕获 win32 异常,方法是转到 Debug 菜单->Exceptions 并标记 ThrownWin32 exceptions 旁边的复选框
    现在使用 F5 激活您的 exe。崩溃应该提醒调试器,您应该能够看到访问冲突的确切位置。

    【讨论】:

    • 是的,也许通过反汇编来获得更多线索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2022-11-03
    • 2017-06-28
    相关资源
    最近更新 更多