为什么我不能在未链接的DLL上调用方法,但可以做到这一点? C ++

时间:2019-07-19 13:07:13

标签: c++ object pointers dll linker

所以我有DLL Alice和DLL Bob。我不能互相调用方法。但是有一座桥。我可以从任何一个DLL分配一个指针(从现在开始我将说 the 指针)并在任何一个DLL中读取它。 但是,如果我将指针分配为Alice中定义的类的实例,则无法从Bob调用它的方法,反之亦然。我也无法访问它的成员。它们根本没有链接(我收到LNK错误)。到目前为止一切顺利。

现在,提一个问题。我在Alice和Bob中创建了相同的类(只是名称不同-我们称它为MirrorClass)。当我分配指针(两个DLL都可以访问它)时,在Alice中创建MirrorClass的实例,我仍然无法从Bob调用它的方法。但是我能做的是假装(显式强制转换),它是Bob的MirrorClass的一个实例,它将调用Bob的MirrorClass版本中定义的Bob的方法,并且一切仍然有效。即使它是Alice的MirrorClass实例。 显然,一旦更改MirrorClass的布局,它就会停止工作。

那怎么可能? 我想这可能与虚拟地址有关,或者也许每个DLL都有自己的地址空间。但是然后,对象只是指针,因此,据我了解,您甚至不需要链接,因此我对这方面的理解真的很差。

感谢每一个建议。

1 个答案:

答案 0 :(得分:0)

如果您有一个指向类的指针,则必须使用vtbl类来定义方法(例如,使用抽象类(纯虚函数))。 例如,这就是COM在Windows中的工作方式。

现在,如果两个DLL中都有相同的接口,并且编译器版本相同,则第一个vtbl将与第二个相同,这将使从A *到B *的强制广播工作正常。

这当然是UB。它可能会或可能不会起作用。

当DLL加载到同一进程中时,它们共享相同的地址空间,并且每个DLL可以使用其他任何一个。