【问题标题】:Rundll32 load order problemrundll32加载顺序问题
【发布时间】:2009-09-10 07:42:46
【问题描述】:

我的产品由两个 dll 组成(为了清楚起见,A.dll 和 B.dll),A.dll 依赖于 B.dll。 A 和 B dll 都在同一个文件夹中(比如 c:\app)。同时旧版本的 B.dll 位于 Windows\System32 文件夹中。当我尝试从命令提示符运行以下命令时(当前文件夹是 c:\app):

rundll32.exe "c:\app\A.dll",DoWork

我收到错误,因为 rundll32 使用 System32 文件夹中的旧版本 B.dll。我尝试使用 A.dll 库的 DllMain 函数中的 SetDllDirectory API 将 c:\app 文件夹添加到搜索路径,但它对我不起作用。
我找不到有关 rundll32 内部结构的任何有用且完整的信息或有关 dll 加载顺序的任何信息。
是否可以在此部署配置中成功执行 rundll32? (我的意思是从 c:\app 文件夹加载新的 B.dll 版本)。

【问题讨论】:

  • 看来我找到了解决方案。我已将 /DELAYLOAD:"B.dll" 开关添加到 A.dll 项目中的链接器选项。在使用 SetDllDirectory API 的那个技巧开始工作并且 rundll32 从 c:\app 文件夹加载新版本的 B.dll 之后。谢谢各位!

标签: c++ deployment


【解决方案1】:

在 SO 上的 DLL 地狱

嗯,复古的方式有点酷。这是一个想法:尝试将 rundll32.exe 复制到与新 dll 和您的产品相同的文件夹中,然后从那里运行它。它可能会起作用......

【讨论】:

  • 是的,它有效。但从我的角度来看,它的解决方案太重了。如果我可以从它的原始文件夹中执行 rundll32.exe 那就完美了。
  • 其他讨厌的问题:当下一个 SP 发布并且 System32\Rundll32.EXE 更新时,您的副本将变得过时并且可能以许多“有趣”的方式失败。而且我希望病毒扫描程序也会认为它是可疑的。
【解决方案2】:

我会摆脱旧的 Dll,或者为新的 dll 使用另一个名称。有两个版本的东西应该做同样的事情,并给它同样的名字,很可能会造成破坏。

【讨论】:

  • DLL 的全部意义在于您可以拥有一个默认值。然后随着新版本的发布,您使用相同的名称,以便旧代码选择新版本。但是,如果存在不兼容性,您仍然可以使用旧版本。不幸的是,它导致了一系列被称为“DLL Hell”的其他问题
  • 没错,就是DLL Hell。 B.dll 是不能重命名的遗留组件。
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多