我有一个带有一些导出函数的C ++ DLL。其中一个导出函数是一个函数,它构建并返回指向类实例的指针。我有这个类的标题(.h)所以我确切知道它的方法是什么。 但是,此类的方法不会导出到DLL中。
我的目标是构建一个包装DLL,它将使用其他DLL中的一些函数。这个新的DLL应该能够用JNA或带有P / Invoke的C#从Java调用。
是否可以调用此对象的方法?如果是的话,我该怎么办?
我试着这么做:
MyObject* myObject = GetMyObject();
myObject->callMethod();
我能够编译我的DLL,但是当我在程序中使用它时它会崩溃(callMethod()崩溃,而不是GetMyObject())。
修改 我已经检查过myObject不是null,我的DLL和其他都是用MSVC构建的,虽然版本可能不一样。
答案 0 :(得分:0)
我猜你说的是Windows。现在它取决于MyObject是具体对象还是纯虚拟接口。使用纯虚拟接口,很有可能它甚至可以在不同的编译器之间工作(技术上是UB,但虚拟表的统一实现是Windows COM工作的前提条件,因此每个编译器实际上需要以相同的方式实现它,如果它想要支持COM)。不需要导出纯虚拟接口(只需确保不通过库边界传递任何C ++异常,因为如果在不同的编译器之间使用,那将会破坏堆栈)。它实际上在Linux中非常相似。请参阅我的答案以获取示例:Providing SDK for my C++ Application
另一方面,如果接口不是纯虚拟的,编译器将查找被调用方法的实现。如果该方法未从DLL导出,则无法找到它。即使它是相同的编译器 - 编译器也根本不知道如何从DLL调用该方法(即要调用的方法的"地址")。
因此,如果您控制DLL并且可以更改它以提供纯虚拟接口(如果现在不是这样),那么它可以工作。