是否有从另一个DLL中加载DLL的最佳实践



我需要从另一个DLL中加载一个DLL。诱惑是将其加载到DllMain中,但已经有令人信服的文档表明这是一个"坏主意"。

冒着提出一个不太具体的问题的风险:是否有从另一个DLL加载DLL的最佳实践?

在我们当前的项目中,我们的主DLL有一个类。我从该类的构造函数加载第二个DLL。但是,由于该类可以在DLL中实例化多次,因此我保留了一个变量,指示该DLL以前是否加载过,以便不再调用LoadLibrary。不知何故,这感觉不是一个好的解决方案,因此我提出了这个问题。

这取决于您的DLL。基本上,你有这些选择:

  1. 链接到该DLL的LIB以自动加载
  2. 加载库时加载另一个DLL,先卸载后卸载
  3. 使用前加载其他DLL,然后卸载

如果你选择1,你会收到非常奇怪的消息,如果DLL2在你试图加载DLL1时丢失,比如"加载DLL1失败"。客户永远不会知道这是因为缺少DLL2。因此,如果您不能100%确定DLL2是否正确安装,我不喜欢使用此解决方案。

然而,当您手动加载DLL2(LoadLibrary)时,您将有机会呈现一条有意义的消息。

如果DLL中有明确的入口和出口点,则可以选择2。如果DLL导出一个或几个函数,即为其他对象创建工厂的函数,就会出现这种情况。然后,您可以在工厂进行装载/卸载。

如果这不会导致您频繁进行加载/卸载,则可以选择3。

此外,您不需要只保留DLL2的一个句柄。您可以多次调用LoadLibrary/FreeLibrary,由框架进行引用计数。

因此,在您的情况允许的情况下,您可以从这3种解决方案中选择一种。只有当您没有明确的入口点,并且调用该函数的频率太高,需要DLL2时,您才必须使用原始解决方案。

最新更新