我正在使用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.exeDLL1.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/

10-11 23:12
查看更多