我需要从另一个DLL中加载DLL。诱惑是将它加载到DllMain中,但已经有令人信服的文档说这是一个“坏主意”。
冒着问一个不太具体的问题的风险:是否有从另一个DLL加载DLL的最佳做法?
在我们当前的项目中,我们的主DLL有一个类。我从该类的构造函数加载第二个DLL。但是,由于该类可以在DLL中多次实例化,因此我保留一个变量,指示DLL是否先前已加载,以便不再调用LoadLibrary。这不知道这是一个很好的解决方案,因此我的问题。
答案 0 :(得分:3)
这取决于你的DLL。 基本上,您有以下选择:
如果选择1,如果尝试加载DLL1时缺少DLL2,则会收到非常奇怪的消息,例如“无法加载DLL1”。并且客户永远不会知道这是因为缺少DLL2。所以我不喜欢使用这个解决方案,如果你不是100%确定DLL2是否正确安装。
但是,当您手动加载DLL2(LoadLibrary)时,您将有机会展示有意义的消息。
如果您的DLL中有明确的入口和出口点,则可以选择2。如果您的DLL导出一个或很少的函数,即为其他对象创建工厂的函数,则会出现这种情况。然后你可以在工厂装货/卸货。
如果这不会导致您经常加载/卸载,则可以选择3。
此外,您不需要只保留DLL2的一个句柄。你可以多次调用LoadLibrary / FreeLibrary,它是进行引用计数的框架。
因此,根据您的情况允许,您可以选择以下3种解决方案中的一种。只有在没有明确的入口点并且您经常调用需要DLL2的函数时,才必须使用原始解决方案。