WinXP下如何修复DWMAPI.DLL延迟加载依赖?

Posted

技术标签:

【中文标题】WinXP下如何修复DWMAPI.DLL延迟加载依赖?【英文标题】:How to fix DWMAPI.DLL delay-load dependency under WinXP? 【发布时间】:2010-09-15 11:08:36 【问题描述】:

我在 WinXP 下构建了一个 .dll,声称它在加载时找不到 DWMAPI.DLL。问题是这个 DLL 是一个 Vista DLL,对于安装了 IE7 的 XP 用户来说,这是一个已知问题。建议卸载 IE7 或通过添加/删除程序修复 .NET Framework。我做了修复,没有任何改变。我不打算卸载IE7,因为必须有更好的解决方案,而不是“重新安装Windows”。

我读过关于试图卸载 IE7 的人的坏消息,所以我不愿意走那条路。

我在 Visual Studio 2003 (7.1) 下使用 C++。我没有看到可能在应用程序启动时强制延迟加载的选项。我只是在创建 DLL 项目时使用了默认设置。我刚才确实找到了一个有趣的选项,Linker->Input->Delay Loaded DLLs,所以我把 DWMAPI.DLL 放在那里强制它被延迟加载。但是,我在链接时得到了这个:

LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll

.. 尝试加载我的 DLL 时,它当然没有改变任何事情。为了它,我添加了导致 DWMAPI.DLL 的整个 DLL 树,我得到了相同的消息。 (为了记录,它是foundation.dll->shell32.dll->shdocvw.dll->mshtml.dll->ieframe.dll->dwmapi.dll。)

为了更具体地了解我在做什么,我正在编写一个 Maya 插件并在脚本编辑器中获取始终有用的文本:

// Error: Unable to dynamically load : D:/blahblahblah/mydll.mll
The specified module could not be found.
 //
// Error: The operation completed successfully.
 //
// Error: The operation completed successfully.
 (mydll) //

我最初使用 Dependency Walker 来追踪问题,这就是我找到 DWMAPI.DLL 的原因。这些是取决于给我的消息,而 DWMAPI.DLL 是唯一旁边有一个黄色问号的东西:

Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

杰拉德是对的。事实上,Maya 使用的 PATH 与 Dependency Walker 不同。我的插件加载了另一个 DLL(用于图像处理),它位于 Maya 插件目录中,并且依赖找到它没有问题,但 Maya 没有。我必须在 Maya.env 的 PATH 中添加“;plug-ins”。

鉴于此问题毕竟与 DWMAPI.DLL 无关,但 DWMAPI 是一个常见问题,我将在 Novell 的网站 here 上发布我找到的关于 DWMAPI 问题的最佳链接。基本上大多数程序在depends.exe中都会有这个警告,但是如果旁边有延迟加载图标,并且你确定程序不会直接或间接调用DWMAPI,那就没问题了。问题在别处。如果延迟加载图标不存在,那么您必须查看 Visual Studio 中的 /DELAY 和 /DELAYLOAD 选项。这取决于给我一个“警告”而不是“错误”的事实是 DWMAPI 没有被自动加载这一事实的线索。

【问题讨论】:

我在我们的一台 Windows 2003 服务器上遇到了这个问题。它只是一个血腥的控制台应用程序,但它(或其他一些依赖项)声称也需要 dwmapi.dll。我很想看到一个明确的答案。 +1。 我认为很多观点都来自 Google drive-bys。仅在“dwmapi.dll”上搜索就有第二个结果。 【参考方案1】:

这是一个棘手的问题。确实有两种主要方式会导致此错误。

1) 您已将项目设置为强制延迟加载的 DLL 在应用程序启动时加载。 DWMAPI.dll 是延迟加载的 DLL,因此通常不会加载,除非调用其中一个函数。除非您尝试在 DLL 中执行此操作,否则这不会在 XP 上发生。但是可以设置一个编译器选项来强制您的应用程序加载延迟加载的 DLL。如果您正在这样做,请不要这样做。

2) 当出现其他问题时,从depends.exe 得到的通常是错误错误。通过dependency walker 运行你的DLL,看看是否有任何其他的依赖问题。如果一切都失败了,请尝试卸载 IE7 并查看问题是否仍然存在。如果是假错误,安装 IE7 后你会看到真正的错误。之后可以重新安装 IE7。

【讨论】:

【参考方案2】:

根据您更新的问题,DWMAPI.dll 可能不是您的问题。每当您链接到 mshtml 时,Dependency walker 总是会给您该错误,因为它总是检查延迟加载的 DLL。

此时我最好的猜测是您的项目设置为动态加载运行时库,并且 Maya 正在更改 DLL 的搜索路径。因此它可能无法找到 MSVC 运行时 DLL。我已经很长时间没有开发 Maya 插件了,但是我最近在使用其他具有插件 DLL 的应用程序时遇到了这个问题。

尝试将 C/C++->代码生成->运行时库中的设置更改为多线程而不是多线程 DLL。

除此之外,您可以尝试调整 Dependency Walker 以使其使用与 Maya 相同的搜索路径,看看您是否可以提出另一个依赖问题。

作为最后的手段,您可以在调试器中启动 Maya 并在 LoadLibrary 上设置断点,然后找出没有以这种方式加载的库。

【讨论】:

不要成为线程上的死灵法师,刚刚调试了同样的问题,我只是想添加一些东西。如果您发现您的 dll 是静态链接的(正如 Gerald 建议的那样)并且您仍然遇到此问题,请使用 Visual Studio 加载您的 dll 并检查其清单。如果项目是由其他人创建的,他们可能已经包含了一个 .manifest 文件,该文件将其依赖项嵌入到二进制文件中,并且操作系统会在找不到这些文件时声称存在问题,即使 DLL 是静态链接的.如果您找到 .manifest,注释这些并重新编译,它可能会解决问题。【参考方案3】:

我确实遇到了这个问题。

需要数小时才能解决的鬼鬼祟祟的问题。

无论如何。我在发布机器上编译了我的托管 C++ 应用程序。收到了客户的投诉,无法运行它,在我们所有的机器上都像魅力一样运行。

事实证明,一个月前的一个晚上,发布机器自动修补了 ATL 漏洞修复程序,所有其他机器也是如此,除了一台 XP 机器。

那台特定的 XP 机器也无法运行该应用程序。安装了 ATL 修复程序(见下面的链接),瞧,一切都像以前一样工作。

http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

因此,吸取教训,始终检查您的中间清单(在调试或发布目录中找到),它将告诉您程序链接到的 DLL 版本。

希望对大家有所帮助。

【讨论】:

【参考方案4】:

尝试将 C/C++->代码生成->运行时库中的设置更改为多线程而不是多线程 DLL。

【讨论】:

以上是关于WinXP下如何修复DWMAPI.DLL延迟加载依赖?的主要内容,如果未能解决你的问题,请参考以下文章

KEIL4 无法定位程序输入点_except_handler4_common于动态链接库msvcrt.dll上

在JAVA中ArrayList如何保证线程安全

延迟加载 UIScrollView 页面时如何摆脱障碍

阻止 CSS 资源

如何在考虑缓存的情况下延迟加载 iframe

延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类