【问题标题】:How to Link to a function from a DLL loaded by a DLL?如何从 DLL 加载的 DLL 链接到函数?
【发布时间】:2018-04-21 19:03:57
【问题描述】:

我正在使用 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 及其所有变量两次?

【问题讨论】:

  • "...但这是否会加载 DLL2.dll 及其所有变量两次?"
  • 这是正确的做法吗?
  • 链接器不可能在没有导入库的情况下链接到 DLL。无论您使用的是 20 年前的工具还是最近的工具。

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


【解决方案1】:

DLL 只在应用程序的地址空间中加载一次。这是由 Windows 设计的。 dll 的导入库加载 dll (LoadLibrary()) 并将本地函数名称分配给 dll 函数。您也可以自己调用LoadLibrary()GetProcAddress() 来做同样的事情。

根据Documentation

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

所以不,DLL 只加载一次,只是它的“UseCount”设置为 2。

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

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

这是正确的做法吗?

这是一种方法(尽管您可以简单地将lib 包含到项目中——就像大多数开发人员所做的那样——而不是使用#pragma,但结果是一样的)。另一种选择是自己调用LoadLibrary()/GetProcAddress()(如果你想有条件地加载dll,这很有用)。我不知道有其他方法。

【讨论】:

  • 我在 vc6 项目中从我的 app.exe 调用 DLL2.dll。我认为有一个隐式设置可以在编译时链接 DLL。我是 VC6 的新手。
  • 是的,导入库(不是 DLL,它是在运行时动态加载/链接的),必须以某种方式包含在项目中(可能通过 @ 987654331@ 在包含文件中?),否则您会收到链接错误,这就是我的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2011-09-06
  • 2011-01-29
相关资源
最近更新 更多