首页 > 解决方案 > 混合延迟加载 dll 和手动调用 LoadLibraryA 是否安全?

问题描述

我正在为 Windows 编译一个程序。

我希望它检查系统中是否存在 foo.dll,如果不存在,则打印错误消息并退出。这样做是否安全:

  1. /DELAYLOAD foo.dll标志传递给链接器;
  2. 在 main() 的最开始,手动调用auto handle = LoadLibraryA("foo.dll")并检查句柄是否不为 NULL;
  3. 如果不为NULL,继续工作;
  4. 在 main() 结束时,调用 FreeLibrary(handle)?

我想知道是否会因为混合延迟加载和手动调用 LoadLibraryA() 而中断。另外,如果有人可以提出一种更简单或更正确的方法来做我想做的事,我将不胜感激。

标签: c++windowsdlllinkerdelayed-execution

解决方案


如果你打算这样做,你应该在你的“测试”调用之后FreeLibrary() 立即LoadLibrary()调用——但肯定是在你通过调用它的一个例程来导致自动加载之前!(当然,假设调用成功!)这样,负载冲突应该没有问题。(您还可以通过调用GetProcAddress().

一旦您确认 DLL 存在(并且显然是可加载的),您将继续执行 - 当您的可执行文件第一次调用其导出函数之一时,DLL 将“自动”加载。

如果您已经(手动)加载了 DLL,那么它将尝试将自己两次加载到同一进程中(我认为)。在某些时候,这肯定会导致问题。

PS:这是检查的好方法,恕我直言!请让我们知道它的票价。

编辑:在评论中的(有点广泛的)讨论之后,我现在很清楚没有必要打电话FreeLibrary()- 无论是当我建议时,还是在程序结束时(因为它会被卸载,无论如何) . 但这仍然是一个很好的解决方案!


推荐阅读