【问题标题】:Calling unexported C++ functions from a DLL从 DLL 调用未导出的 C++ 函数
【发布时间】:2016-02-15 18:36:48
【问题描述】:

我有一个带有一些导出函数的 C++ DLL。导出的函数之一是构建并返回指向类实例的指针的函数。我有这个类的标题(.h),所以我确切地知道它的方法是什么。 但是,该类的方法并没有导出到 DLL 中。

我的目标是构建一个包装 DLL,它将使用其他 DLL 中的一些函数。应该能够使用 JNA 从 Java 或使用 P/Invoke 从 C# 调用这个新的 DLL。

可以调用这个对象的方法吗?如果是,我应该如何进行?

我试图简单地这样做:

MyObject* myObject = GetMyObject();
myObject->callMethod();

我能够编译我的 DLL,但是,当我在程序中使用它时它会崩溃(callMethod() 崩溃,而不是 GetMyObject())。

编辑: 我检查了 myObject 不为空,并且我的 DLL 和另一个都是用 MSVC 构建的,尽管版本可能不一样。

【问题讨论】:

  • 1.你检查过myObject != NULL吗? 2. 你的 DLL 是否使用与另一个相同的编译器和相同的版本构建?

标签: c++ dll


【解决方案1】:

我猜你说的是 Windows。现在取决于 MyObject 是具体对象还是纯虚拟接口。使用纯虚拟接口,它甚至可以在不同的编译器之间工作的可能性很高(技术上是 UB,但虚拟表的统一实现是 Windows COM 工作的先决条件,所以每个编译器实际上都需要以相同的方式实现它,如果它想要支持COM)。不需要导出纯虚拟接口(只需确保您没有在库边界上传递任何 C++ 异常,因为如果在不同编译器之间使用这会破坏堆栈)。它实际上在 Linux 中的工作方式非常相似。例如,请参阅我的答案:Providing SDK for my C++ Application

另一方面,如果接口不是纯虚拟的,编译器会寻找被调用方法的实现。如果该方法不是从 DLL 中导出的,它将无法找到它。即使它是同一个编译器 - 编译器根本不知道如何从 DLL 调用方法(即要调用的方法的“地址”)。

因此,如果您可以控制 DLL,并且可以将其更改为提供纯虚拟接口(如果现在不是这种情况),那么它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多