我有一个 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 通信,如 kernel32
和 user32
。
例如,函数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/