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

27

我在WinXP下编译了一个.dll文件,但在加载时它声称找不到DWMAPI.DLL。问题在于这个DLL是Vista DLL,这是对于安装IE7的XP用户已知的问题。建议是通过添加/删除程序卸载IE7或修复.NET Framework。我进行了修复,但没有改变任何东西。我不想卸载IE7,因为一定有更好的解决方案,而不是等同于“重新安装Windows”的方法。

我读到有关那些试图卸载IE7的人的坏消息,所以我不愿意采用那种方式。

我正在使用Visual Studio 2003(7.1)下的C++。在应用程序启动时,我没有看到可以强制延迟加载的选项。我只是在创建DLL项目时使用了默认设置。我刚刚发现了一个有趣的选项,链接器->输入->延迟加载的DLL,所以我将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的原因。以下是depends工具给出的信息,并且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.

Gerald正确。事实上,Maya使用的是不同于Dependency Walker的PATH。我的插件加载另一个DLL(用于图像处理),它位于Maya插件目录中,并且依赖项可以被找到并正常加载,但Maya没有。我不得不在Maya.env中添加“;plug-ins”到路径中。

既然这个问题与DWMAPI.DLL无关,但DWMAPI是一个常见的问题,那么我将在Novell的网站上发布我发现的关于DWMAPI问题的最佳链接这里。基本上,大多数程序都会在depends.exe中显示此警告,但如果它旁边有一个延迟加载图标,并且您确定该程序不会直接或间接调用DWMAPI,则没问题。问题出在其他地方。如果延迟加载图标不存在,则必须查看Visual Studio中的/DELAY和/DELAYLOAD选项。Depends给我“警告”而不是“错误”的事实提示了DWMAPI不会自动加载。


1
我在我们的一个Windows 2003服务器上遇到了这个问题。它只是一个简单的控制台应用程序,但它(或其他某些依赖项)声称也需要dwmapi.dll。我很想看到一个明确的答案。+1。 - Kev
我认为很多浏览量来自于 Google 的驱动程序。只需搜索 "dwmapi.dll",就会得到这个结果的第二个位置。 - Jim Buck
4个回答

7
根据您更新的问题,DWMAPI.dll 可能不是您的问题。每当链接到 mshtml 时,Dependency Walker 都会始终检查延迟加载的 DLL,因此会给您报错。
目前我的最佳猜测是,您的项目设置为动态加载运行库,并且由于 Maya 更改了 DLL 的搜索路径,因此无法找到 MSVC 运行时 DLL(s)。我很久以前就没有开发 Maya 插件了,但最近在其他应用程序中使用插件 DLLs 时也遇到过这个问题。
尝试更改 C/C++->代码生成->运行库 中的设置,从多线程 DLL 改为多线程即可。
除此之外,您可以尝试调整 Dependency Walker,使其使用与 Maya 相同的搜索路径,看看是否还有其他依赖项问题。
如果万不得已,您可以在调试器中启动 Maya,并在 LoadLibrary 上设置断点,找出未通过该方式加载的库。

不要在这个帖子里做一个死灵法师,因为我刚刚调试了同样的问题,我只想添加一些东西。如果你发现你的dll是静态链接的(正如Gerald建议的那样),但仍然遇到这个问题,请使用Visual Studio加载你的dll并检查其清单。如果这个项目是由别人创建的,他们可能已经包含了一个.manifest文件,它嵌入在二进制文件中,说明它的依赖关系是什么,即使DLL是静态链接的,操作系统也会声称有问题,当它找不到这些文件时。如果你找到.manifest文件,请注释掉它们并重新编译,这可能会解决问题。 - Decker

3

我曾经遇到过这个问题。

这是一个难以发现的问题,花费了几个小时才解决。

总之,我在发布机器上编译了我的托管C++应用程序。客户抱怨无法运行它,但我们所有的机器都可以正常工作。

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

那台特定的XP机器也无法运行该应用程序。安装了ATL修补程序(请参见下面的链接),然后一切又恢复了正常。

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

所以,我们得到了教训,始终要检查您的中间清单(在调试或发布目录中找到),这将告诉您程序已链接的DLL版本。

希望这对任何人都有所帮助。


3
这是一个棘手的问题。出现此错误有两种主要原因。
1)你的项目设置为强制延迟加载DLL在应用程序启动时加载。DWMAPI.dll是一个延迟加载的DLL,通常只有在调用其函数时才会被加载。在XP上,除非你尝试在DLL中这样做,否则不会发生。但是可以设置编译器选项以强制应用程序加载延迟加载的DLL。如果你正在这样做,请不要这样做。
2)在存在其他问题时,经常会从depends.exe中得到虚假错误。通过依赖项查看器运行DLL,并查看是否存在其他依赖项问题。如果所有其他方法都失败,请尝试卸载IE7并查看问题是否仍然存在。如果这是一个虚假错误,在安装IE7后,您将看到真正的错误。之后可以再次安装IE7。

1

尝试将您的设置更改为 C/C++->Code Generation->Runtime Library 中的 Multi-Threaded,而不是 Multi-Threaded DLL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接