gpt4 book ai didi

c++ - 混合延迟加载和手动调用 LoadLibraryA 是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:49 25 4
gpt4 key购买 nike

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

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

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

我想知道是否会由于混合延迟加载和手动调用 LoadLibraryA() 而造成某些问题。此外,如果有人可以建议一种更简单或更正确的方法来做我想做的事情,我将不胜感激。

最佳答案

如果您要这样做,您应该在对 LoadLibrary() 进行“测试”调用后立即调用 FreeLibrary() -但肯定是在您通过调用其例程之一导致自动加载之前! (当然,前提是调用成功!)这样一来,负载冲突应该就没有问题了。 (您还可以进行进一步的测试,例如通过调用 GetProcAddress() 检查是否存在所有必需的例程。

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

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

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

编辑:在评论中进行了(有些广泛的)讨论之后,我现在很清楚,没有必要调用 FreeLibrary() - 无论是在我建议的时候,还是实际上,在程序结束时(无论如何它将被卸载)。但这仍然是一个很好的解决方案!

关于c++ - 混合延迟加载和手动调用 LoadLibraryA 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com