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