加载调用加载它的DLL中的函数的DLL

时间:2010-12-07 21:12:02

标签: c++ dll dependencies loading

我有一个将由程序加载的DLL,并且该DLL将依次加载另一个DLL来处理一些不应该在主DLL中的东西。但是,第二个DLL需要能够与第一个DLL通信。 DLL是否可以在加载它的DLL中使用导出的函数?例如

  1. 程序使用LoadLibrary加载DLL A.
  2. DLL A使用LoadLibrary加载DLL B.
  3. DLL A使用GetProcAddress调用DLL B中的一些函数。
  4. B依次在DLL A上执行GetProcAddress并调用某些函数。
  5. DLL A正在与主程序进行交互,因为DLL B正在处理并调用DLL A的导出函数。
  6. 这会起作用吗?这是正确的方法吗?

3 个答案:

答案 0 :(得分:5)

是的,它会起作用。 DLL B可以安全地调用DLL A上的LoadLibrary来获取GetProcAddress调用其所需函数的实例句柄。模块加载器将发现DLL A已经在进程内存中,并且只会将它的实例句柄返回给DLL B.

注意:虽然主程序依赖并加载DLL A的一个版本,但版本仍有特定的警告,而DLL B需要不同的版本。如果是这种情况,DLL B必须使用它所需的DLL A版本的显式路径调用LoadLibrary,并且DLL A必须支持SxS以支持在进程内存中加载它的两个版本。

避免这种情况的最简单方法是,如果您同时控制进程和DLL B,则始终确保它们需要/使用相同版本的DLL A.

答案 1 :(得分:0)

这不是容器的确切任务吗?更多的是说明确你的依赖关系,提取共享功能并将其移动到另一个DLL,不要在依赖关系图中做一个循环

答案 2 :(得分:0)

是的,它会起作用(我在几年前工作的商业产品中也有类似的情况)。然而,这是一场噩梦般的半场。我建议修改你的库结构,以避免循环依赖。回调或创建另一个图书馆以便在另外两个图书馆之间进行编组,这将有效,并将使您的生活更轻松。版本问题只是冰山一角;在具有循环依赖关系的体系结构中调试问题可能会使您头晕目眩。