C ++指针是否适用于EXE和DLL

时间:2017-08-02 12:54:18

标签: c++ windows pointers dll

我有一个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()吗?

2 个答案:

答案 0 :(得分:2)

简短的回答是 - 当然会起作用。否则,您的流程无法与kernel32user32等重要广告进行通信。

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

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

答案 1 :(得分:1)

是的,这应该有效。实际上这就是插件的工作原理。

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