2

我需要从另一个 DLL 中加载一个 DLL。诱惑是在 DllMain 中加载它,但已经有令人信服的文档说这是一个“坏主意”。

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

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

4

1 回答 1

3

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

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

如果您选择 1,您将收到非常奇怪的消息,如果在您尝试加载 DLL1 时缺少 DLL2,例如“加载 DLL1 失败”。而且客户永远不会知道这是因为缺少 DLL2。所以我不喜欢使用这个解决方案,如果你不能 100% 确定 DLL2 是否正确安装。

但是,当您手动加载 DLL2 (LoadLibrary) 时,您就有机会呈现有意义的消息。

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

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

此外,您无需只保留一个 DLL2 句柄。您可以多次调用 LoadLibrary/FreeLibrary,它是执行引用计数的框架。

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

于 2012-09-07T15:21:14.980 回答