我正在使用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.exe
和DLL1.dll
中都有链接,但这会加载DLL2.dll
及其所有变量两次吗?
答案 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,则非常有用)。我不知道其他任何方式。