c++ - C++ 指针是否跨 EXE 和 DLL 工作

标签 c++ windows pointers dll

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

在这个指针从主EXE移动到DLL函数的过程中,我想知道它会不会有什么问题,或者我需要注意什么预防措施。

Main.EXE with 3 static libs (A.lib, B.lib,C.lib) Main.EXE also links

with 2 DLL's - d1.dll, d2.dll. Each of these static library and DLL

also statically links to a static library X.lib.

调用流程:

main() in main.EXE calls AFunc() in A.lib and passes a pointer to an object of some class X which is in X.lib.

Now AFunc() in A.lib calls BFunc() in B.lib & passes the "same pointer to an object of class X" which is in X.lib.

Now BFunc() in B.lib calls CFunc() in C.lib & passes the "same pointer to an object of class X" which is in X.lib.

Now CFunc() in C.lib calls D1Func() in D1.DLL & passes the "same pointer to an object of class X" which is in X.lib.

Now D1Func() in D1.DLL calls D2Func() in D2.DLL & passes the "same pointer to an object of class X" which is in X.lib.

我的问题是,指针在 C.lib(main.EXE 的一部分)和 D1.DLL 的 D1Func() 中传递是否有效?

最佳答案

简短的回答是 - 当然可以。否则您的进程无法与任何重要的 dll 通信,如 kernel32user32

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

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

关于c++ - C++ 指针是否跨 EXE 和 DLL 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461468/

相关文章:

c++ - 解压一个类型列表

c++ - 为什么我会收到此 ifstream 错误?

c++ - 当 spy++ 没有提供任何可从软件中提取的详细信息时该怎么办?

windows - 如何让 win32 控制台识别 ANSI/VT100 转义序列?

C++ - 为什么静态字符串在被不同的函数引用时会给出略微不同的地址?

c++ - std::char_traits::assign() 的目的是什么?

c++ - 为什么 list::push_back 在 VC++ 中比在 g++ 中慢得多?

c - 为什么这个指针看起来指向它自己?

html - Windows 中 <select> 列表的宽度比 mac 宽

c++ - Pointer-to- "inner struct"成员是否被禁止?