【发布时间】:2019-11-28 11:46:51
【问题描述】:
所以我有 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 都有自己的地址空间。但是,对象只是指针,所以根据我的理解,你甚至不需要链接,所以我真的不理解这一点。
感谢您的每一个建议。
【问题讨论】:
-
为什么不显示代码。
-
任何 DLL 都可以使用任何其他 DLL。您只需要包含正确的定义并正确配置导入。
-
@MichaelChourdakis 这是一个庞大的代码库,很多项目,而且一团糟。所以我试着至少在文字上简化它。
-
@ElderBug 是的,但我认为我没有。它没有链接,没有导出,没有“LoadDll”之类的,只是包含标题以了解类布局。
-
如果没有 LoadLibrary(“动态”DLL),则必须有导入,即使它们是隐式的。通常是
__declspec( dllimport )隐藏在宏后面。只要您没有相互依赖的标头,A 使用 B 和 B 使用 A 应该不是问题。 A 导入 B 和 B 导入 A。两者之一将在之前加载,但没关系。加载第二个时,第一个已经加载,可以解析导入。
标签: c++ object pointers dll linker