我在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树,我得到了同样的消息。(记录为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的原因。这些是Dependency给我的信息,DWMAPI.LL是唯一一个旁边有黄色问号的东西:
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与依赖性Walker不同。我的插件加载了另一个DLL(用于图像处理),该DLL位于Maya插件目录中并依赖于它。我发现它没有问题,但Maya没有。我不得不在Maya.env.的PATH中添加";插件"
由于这个问题毕竟与DWMAPI.DLL无关,但DWMAPI是一个常见的问题,我将在Novell的网站上发布我发现的关于DWMAPI问题的最佳链接。基本上,大多数程序都会在dependens.exe中出现此警告,但如果它旁边有一个延迟加载图标,并且您确信该程序不会直接或间接调用DWMAPI,那么这也没关系。问题出在别处。如果延迟加载图标不存在,那么您必须查看Visual Studio中的/delay和/DELAYLOAD选项。依赖的事实给了我一个"警告"而不是"错误",这是DWMAPI没有自动加载的线索。
根据您更新的问题,DWMAPI.dll可能不是您的问题。当你链接到mshtml时,依赖性助行器总是会给你这个错误,因为它总是检查延迟加载的DLL。
在这一点上,我的最佳猜测是,您已经将项目设置为动态加载运行库,并且Maya正在更改DLL的搜索路径。因此,它可能无法找到MSVC运行时DLL。我已经很久没有开发Maya插件了,但最近我在其他有插件DLL的应用程序中遇到了这个问题。
请尝试将C/C++->代码生成->运行库中的设置更改为多线程而不是多线程DLL。
除此之外,您还可以尝试摆弄"依赖性Walker",使其使用与Maya相同的搜索路径,并查看是否会出现另一个依赖性问题。
作为最后的手段,您可以在调试器中启动Maya,并在LoadLibrary上设置断点,然后找出未以这种方式加载的库。
这是一个棘手的问题。实际上有两种主要的方式会导致这个错误。
1) 您已将项目设置为在应用程序启动时强制加载延迟加载的DLL。DWMAPI.dll是一个延迟加载的dll,因此通常不会加载,除非调用它的某个函数。除非您尝试在DLL中执行,否则在XP上不会发生这种情况。但是,也可以设置编译器选项来强制应用程序加载延迟加载的DLL。如果你在这么做,不要。
2) 当出现其他问题时,dependens.exe通常会出现错误。通过依赖性助行器运行DLL,看看是否还有其他依赖性问题。如果所有其他操作都失败,请尝试卸载IE7,看看问题是否仍然存在。如果这是一个错误,安装IE7后,您将看到真正的错误。之后您可以再次安装IE7。
我正是遇到了这个问题。
花了几个小时才解决的狡猾问题。
不管怎样。我在发布机器上编译了我的托管C++应用程序。收到了客户的投诉,他们无法运行它,它在我们所有的机器上都像一个魅力。
事实证明,发布的机器在一个月前的一个晚上自动修补了ATL漏洞,除一台XP机器外,其他所有机器也是如此。
那台特别的XP机器也无法运行该应用程序。安装了ATL修复程序(见下面的链接),瞧,一切都和以前一样。
http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en
因此,吸取的教训是,始终检查您的中间清单(在调试或发布目录中找到),这将告诉您程序链接的DLL版本。
希望它能帮助到任何人。
尝试将C/C++->代码生成->运行库中的设置更改为多线程而不是多线程DLL。