首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复WinXP下的DWMAPI.DLL延迟负载依赖?

如何修复WinXP下的DWMAPI.DLL延迟负载依赖?
EN

Stack Overflow用户
提问于 2008-10-06 07:14:15
回答 4查看 78.5K关注 0票数 27

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

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

我在Visual Studio2003 (7.1)下使用C++。我没有看到在应用程序启动时强制延迟加载的选项。我只是在创建DLL项目时使用了默认设置。我刚才确实发现了一个有趣的选项,链接器->输入->延迟加载的DLL,所以我把DWMAPI.DLL放进去强制它延迟加载。然而,我在链接时得到了这样的结果:

代码语言:javascript
复制
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插件,并在脚本编辑器中获取始终有用的文本:

代码语言:javascript
复制
// 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的原因。这些是Dependency给我的消息,DWMAPI.DLL是唯一一个旁边有黄色问号的东西:

代码语言:javascript
复制
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使用的路径与依存关系漫游器不同。我的插件加载了另一个DLL (用于图像处理),它位于Maya插件目录中,并且发现它没有问题,但是Maya没有。我不得不在Maya.env的路径中添加“;插件”。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-10-06 21:40:39

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

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

尝试将C/C++->Code Generation->Runtime Library中的设置更改为多线程而不是多线程DLL。

除此之外,您可以尝试摆弄依赖项步行器,使其使用与Maya相同的搜索路径,看看是否可以提出另一个依赖项问题。

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

票数 7
EN

Stack Overflow用户

发布于 2008-10-06 07:50:53

这是一个棘手的问题。有两种主要的方法可以让你得到这个错误。

1)您的项目设置为在应用程序启动时强制加载延迟加载的DLL。DWMAPI.dll是一个延迟加载的动态链接库,因此除非调用它的一个函数,否则通常不会加载。这在XP上是不会发生的,除非你尝试在你的DLL中这样做。但也可以设置一个编译器选项,强制应用程序加载延迟加载的DLL。如果你要这么做,就别这么做。

2)当出现另一个问题时,通常会从depends.exe得到一个假错误。通过依赖遍历运行您的DLL,并查看是否存在任何其他依赖问题。如果所有方法都失败了,请尝试卸载IE7,并查看问题是否仍然存在。如果这是一个假错误,那么在你安装IE7之后,你会看到真正的错误。之后,您可以再次安装IE7。

票数 3
EN

Stack Overflow用户

发布于 2009-08-25 12:10:38

我就遇到了这样的问题。

花了几个小时才能解决的诡秘问题。

不管怎么说。我在发布机器上编译了我的托管C++应用程序。客户抱怨它不能运行,它在我们所有的机器上都像一个护身符一样工作。

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

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

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

所以学到的教训是,总是检查你的中间清单(在debug或release目录中找到),它会告诉你程序链接到的DLL的版本。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/173433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档