【问题标题】:Does C++ pointers work across EXEs and DLLsC++ 指针是否可以跨 EXE 和 DLL 工作
【发布时间】:2017-08-02 12:54:18
【问题描述】:

我有一个 C++ 应用程序,它有许多静态 ibs (*.lib) 和 DLL。 我正在我的 EXE 中创建一个对象,然后我继续使用函数调用将指向该对象的指针从 1 个库传递到另一个库。

在这个过程中,当这个指针从主 EXE 移动到 DLL 的函数时,我想了解它是否有任何问题或者我需要采取任何预防措施。

带有 3 个静态库(A.lib、B.lib、C.lib)的 Main.EXE Main.EXE 还链接

带有 2 个 DLL - d1.dll、d2.dll。这些静态库和DLL中的每一个

还静态链接到静态库 X.lib。

呼叫流程

main.EXE 中的 main() 调用 A.lib 中的 AFunc() 并将指针传递给 X.lib 中某个 X 类的对象。

现在 A.lib 中的 AFunc() 调用 B.lib 中的 BFunc() 并传递“相同的指针 到 X.lib 中的 X 类对象。

现在 B.lib 中的 BFunc() 调用 C.lib 中的 CFunc() 并传递“相同的指针 到 X.lib 中的 X 类对象。

现在 C.lib 中的 CFunc() 调用 D1.DLL 中的 D1Func() 并传递“相同 指向 X.lib 中的 X 类对象的指针。

现在 D1.DLL 中的 D1Func() 调用 D2.DLL 中的 D2Func() 并传递“相同 指向 X.lib 中的 X 类对象的指针。

我的查询是通过 C.lib(main.EXE 的一部分)中的 CFunc() 和 D1.DLL 的 D1Func() 的指针是否有效?

【问题讨论】:

  • 你知道操作系统进程是如何工作的吗?加载 DLL 意味着什么?
  • 应该可以。只要它们是同一进程的一部分以及在运行时加载正确的动态库,您链接哪种类型的库都没有关系。
  • 进程中的所有代码(EXE、DLL 等)都有公共地址空间。并注意函数地址 - 这也是指针
  • @TheQuantumPhysicist - 我不是来拥抱任何人的。我礼貌地询问了他的知识范围。或者你认为关于虚拟内存的一整章适合作为 SO 的答案吗?

标签: c++ windows pointers dll


【解决方案1】:

简短的回答是 - 它当然会起作用。否则您的进程无法与任何重要的 dll 通信,例如 kernel32user32

例如,函数HeapAlloc 获取指向堆的指针作为第一个参数,并返回指向已分配内存的指针。函数本身在kernel32.dll 中实现。如果您不能将指针传递给 dll 或 lib,这将永远无法工作。

另一个需要考虑的问题是 - 假设我们有一个指向 C++ 对象的指针,事实上指针本身在二进制文件中是有效的,这并不意味着该对象在父 EXE 和被调用者 DLL。您需要确保这两个二进制文件是 ABI 兼容的。例如,将在 VC++ 下编译的 exe 中的 std::string 指针传递给在 GCC 下编译的 DLL 是一个坏主意。

【讨论】:

    【解决方案2】:

    是的,应该可以。实际上插件就是这样工作的。

    插件的工作原理:程序加载 DLL/共享库,并将其“接口”指针传递给插件,然后插件使用此接口在程序中实现新功能。您可以使用dynamic_cast 来验证指针是否与您假设的接口兼容。

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多