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