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

如何修复WinXP下的DWMAPI.DLL延迟加载依赖关系?,dll,windows-xp,dwm,Dll,Windows Xp,Dwm,我在WinXP下构建了一个.dll,声称加载时找不到DWMAPI.dll。问题是这个DLL是一个Vista DLL,对于安装了IE7的XP用户来说,这是一个已知的问题。建议卸载IE7或通过添加/删除程序修复.NET Framework。我做了修理,什么也没变。我不打算卸载IE7,因为一定有更好的解决方案,而不是“重新安装windows” 我读过一些关于试图卸载IE7的人的坏消息,所以我不愿意走这条路 我在Visual Studio 2003(7.1)下使用C++。我没有看到在应用程序启动时强制延

我在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-DLL,所以我把DWMAPI.DLL放在里面,强制它延迟加载。但是,我在链接时得到了以下信息:

LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll
。。当然,当尝试加载我的DLL时,它没有改变任何事情。更糟糕的是,我添加了通向DWMAPI.DLL的整个DLL树,得到了相同的消息。(对于记录,它是基础。DLL> SHIL32。DLL:SHDOVv.DLL>MsHTML.DLL>IEGrim.DLL>DWMAPI.DLL)< /P> 为了更具体地说明我在做什么,我正在编写一个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的原因。这些是Dependes给我的消息,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使用的路径与依赖项漫游器不同。我的插件加载另一个DLL(用于图像处理),该DLL位于Maya插件目录中,并且找到它时没有问题,但Maya没有。我必须在Maya.env中的路径中添加“插件”


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

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

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


2) 当出现其他问题时,通常会从depends.exe获得错误。通过dependency walker运行DLL,查看是否存在任何其他依赖性问题。如果所有其他操作都失败,请尝试卸载IE7,看看问题是否仍然存在。如果这是一个错误,在安装IE7之后,您将看到真正的错误。您可以在以后再次安装IE7。

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

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


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

除此之外,您还可以尝试摆弄Dependency Walker,使其使用与Maya相同的搜索路径,并查看是否可以产生另一个依赖性问题


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

我正好遇到了这个问题

需要几个小时才能解决的棘手问题

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

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

那台特殊的XP机器也无法运行该应用程序。安装了ATL补丁(见下面的链接),瞧,一切都和以前一样

因此,吸取的教训是,始终检查中间清单(在debug或release目录中找到),它将告诉您程序链接所针对的DLL的版本


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

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

我在一台Windows 2003服务器上遇到了这个问题。它只是一个血腥的控制台应用程序,但它(或其他依赖项)声称也需要dwmapi.dll。我很想看到一个明确的答案+1.我认为很多观点都来自谷歌的驾车旁。仅仅在“dwmapi.dll”上搜索就得到了第二个结果。我不想成为线程上的死灵法师,刚刚调试了同样的问题,我只想添加一些东西。如果您发现您的dll是静态链接的(正如Gerald所建议的),并且仍然存在此问题,请使用Visual Studio加载dll并检查其清单。如果项目是创建的