如何从DLL加载的DLL链接到函数?

时间:2017-11-08 22:28:56

标签: c++ visual-studio-2010 mfc vc6

我正在使用VS2010,我有一个分层的应用程序,如下所示:

app.exe
DLL1.dll
DLL2.dll

其中app.exe加载DLL1然后加载DLL2。我希望我的应用程序在DLL2中调用函数,如DLL2::setvariable( value )

我已经在我的vc6工作区中正确设置了这一点,而无需为DLL2.dll指定lib文件。如何在VS2010环境中进行设置?对于DLL2.dll的所有调用,我一直收到一个未解决的符号链接器错误。

我试图加入 #pragma comment(lib ,"DLL2.lib")app.exeDLL1.dll中都有链接,但这会加载DLL2.dll及其所有变量两次吗?

1 个答案:

答案 0 :(得分:2)

DLL只在应用程序的地址空间中加载一次。这是Windows设计的。 dll的import-library加载dll(LoadLibrary())并将本地函数名称分配给dll函数。您也可以致电LoadLibrary()GetProcAddress()来自行完成相同的工作。

根据Documentation

系统维护所有已加载模块的每进程引用计数。调用LoadLibrary会增加引用计数。调用FreeLibrary或FreeLibraryAndExitThread函数会减少引用计数。系统在其引用计数达到零或进程终止时(无论引用计数如何)卸载模块。

所以不,DLL只加载一次,只将其“UseCount”设置为2。

  

我已经在我的vc6工作区中正确设置了这一点,而无需为DLL2.dll指定lib文件

我猜你没有从DLL2::setvariable( value )拨打app.exe,否则你是怎么做到的?

  

这是正确的方法吗?

这是一种方法(尽管你可以简单地将lib包含在项目中 - 正如大多数开发人员所做的那样 - 而不是使用#pragma,但rseult是相同的)。另一种方法是自己调用LoadLibrary() / GetProcAddress()(如果要有条件地加载dll,则非常有用)。我不知道其他任何方式。