我正在使用VS2010,并且有一个看起来像这样的分层应用程序:
app.exe
DLL1.dll
DLL2.dll
其中app.exe加载DLL1,然后加载DLL2。我希望我的应用程序像
DLL2::setvariable( value )
这样调用DLL2中的函数。我已经在vc6工作区中正确设置了此设置,而不必为
DLL2.dll
指定lib文件。如何在VS2010环境中进行设置?对于DLL2.dll
的所有调用,我一直收到未解决的符号链接器错误。我试图包括
#pragma comment(lib ,"DLL2.lib")
在
app.exe
和DLL1.dll
中都可以链接,但这是否会两次加载DLL2.dll
及其所有变量? 最佳答案
DLL仅在应用程序的地址空间中加载一次。这是Windows设计的。 dll的导入库将加载dll(LoadLibrary()
)并将本地函数名称分配给dll函数。您可以通过调用LoadLibrary()
和GetProcAddress()
来自己做同样的事情。
根据Documentation:
系统在所有加载的模块上维护每个进程的参考计数。调用LoadLibrary会增加引用计数。调用FreeLibrary或FreeLibraryAndExitThread函数可减少引用计数。当模块的参考计数达到零或进程终止时(与参考计数无关),系统将卸载模块。
因此,没有,一个DLL仅加载一次,只有其“ UseCount”设置为2。
我已经在vc6工作区中正确设置了此设置,而不必为DLL2.dll指定lib文件
我猜您当时不是从DLL2::setvariable( value )
呼叫app.exe
,否则您是怎么做到的?
这是正确的方法吗?
这是这样做的一种方式(尽管您可以像大多数开发人员一样简单地将lib
包含到项目中,而不是使用#pragma
,但是结果是相同的)。另一种选择是自己调用LoadLibrary()
/ GetProcAddress()
(如果要有条件地加载dll,则很有用)。我没有其他办法知道。
关于c++ - 如何从DLL加载的DLL链接到函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47190790/