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

Is it safe to mix delayed dll loading and manual call of LoadLibraryA?

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

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

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

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

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

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

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

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

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