c++ - 混合延迟加载 dll 和手动调用 LoadLibraryA 是否安全?
问题描述
我正在为 Windows 编译一个程序。
我希望它检查系统中是否存在 foo.dll,如果不存在,则打印错误消息并退出。这样做是否安全:
- 将
/DELAYLOAD foo.dll
标志传递给链接器; - 在 main() 的最开始,手动调用
auto handle = LoadLibraryA("foo.dll")
并检查句柄是否不为 NULL; - 如果不为NULL,继续工作;
- 在 main() 结束时,调用 FreeLibrary(handle)?
我想知道是否会因为混合延迟加载和手动调用 LoadLibraryA() 而中断。另外,如果有人可以提出一种更简单或更正确的方法来做我想做的事,我将不胜感激。
解决方案
如果你打算这样做,你应该在你的“测试”调用之后FreeLibrary()
立即LoadLibrary()
调用——但肯定是在你通过调用它的一个例程来导致自动加载之前!(当然,假设调用成功!)这样,负载冲突应该没有问题。(您还可以通过调用GetProcAddress()
.
一旦您确认 DLL 存在(并且显然是可加载的),您将继续执行 - 当您的可执行文件第一次调用其导出函数之一时,DLL 将“自动”加载。
如果您已经(手动)加载了 DLL,那么它将尝试将自己两次加载到同一进程中(我认为)。在某些时候,这肯定会导致问题。
PS:这是检查的好方法,恕我直言!请让我们知道它的票价。
编辑:在评论中的(有点广泛的)讨论之后,我现在很清楚没有必要打电话FreeLibrary()
- 无论是当我建议时,还是在程序结束时(因为它会被卸载,无论如何) . 但这仍然是一个很好的解决方案!