我有一个C ++应用程序,它有许多静态ibs(* .lib)和DLL。 我正在我的EXE中创建一个对象,然后我继续使用函数调用将指向此对象的指针从1个库传递到另一个库。
在此过程中,当此指针从主EXE移动到DLL的功能时,我想知道它是否有任何问题,或者我需要注意任何预防措施。
Main.EXE有3个静态库(A.lib,B.lib,C.lib)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类的对象“在X.lib。
现在B.lib中的BFunc()在C.lib&中调用CFunc()。传递“相同的指针 到X类的对象“在X.lib。
现在C.lib中的CFunc()调用D1.DLL&中的D1Func()。通过“相同的 指向类X“X.lib。
中对象的指针现在D1.DLL中的D1Func()在D2.DLL&中调用D2Func()。通过“相同的 指向类X“X.lib。
中对象的指针
我的查询是指针传递给C.lib中的CFunc()(main.EXE的一部分)和D1.DLL的D1Func()吗?
答案 0 :(得分:2)
简短的回答是 - 当然会起作用。否则,您的流程无法与kernel32
和user32
等重要广告进行通信。
例如,函数HeapAlloc获取指向堆的指针作为第一个参数,并返回指向已分配内存的指针。函数本身在kernel32.dll
中实现。如果你不能将指针传递给dll或lib,这将无法工作。
要考虑的另一个问题是 - 假设我们有一个指向C ++对象的指针,指针本身 在二进制文件中有效的事实,它并不意味着对象被对待在父EXE和被调用者DLL中相同。你需要确保两个二进制文件是ABI兼容的。例如,将std::string
的指针从在VC ++下编译的exe传递给在GCC下编译的DLL是一个坏主意。
答案 1 :(得分:1)
是的,这应该有效。实际上这就是插件的工作原理。
插件如何工作:程序加载DLL /共享库,并将其“接口”指针传递给插件,然后插件使用此接口在程序中实现新功能。您可以使用dynamic_cast
来验证指针是否与您正在假设的接口兼容。