我有一个将由程序加载的DLL,并且该DLL将依次加载另一个DLL来处理一些不应该在主DLL中的东西。但是,第二个DLL需要能够与第一个DLL通信。 DLL是否可以在加载它的DLL中使用导出的函数?例如
这会起作用吗?这是正确的方法吗?
答案 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)
是的,它会起作用(我在几年前工作的商业产品中也有类似的情况)。然而,这是一场噩梦般的半场。我建议修改你的库结构,以避免循环依赖。回调或创建另一个图书馆以便在另外两个图书馆之间进行编组,这将有效,并将使您的生活更轻松。版本问题只是冰山一角;在具有循环依赖关系的体系结构中调试问题可能会使您头晕目眩。