27

我在 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 没有被自动加载这一事实的线索。

4

4 回答 4

7

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

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

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

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

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

于 2008-10-06T21:40:39.417 回答
3

这是一个棘手的问题。确实有两种主要方式会导致此错误。

1)您将项目设置为强制延迟加载的 DLL 在应用程序启动时加载。DWMAPI.dll 是延迟加载的 DLL,因此通常不会加载,除非调用其中一个函数。除非您尝试在 DLL 中执行此操作,否则这不会在 XP 上发生。但是可以设置一个编译器选项来强制您的应用程序加载延迟加载的 DLL。如果您正在这样做,请不要这样做。

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

于 2008-10-06T07:50:53.070 回答
3

我正是这个问题。

需要数小时才能解决的鬼鬼祟祟的问题。

反正。我在发布机器上编译了我的托管 C++ 应用程序。收到无法运行它的客户的投诉,它在我们所有的机器上都像魅力一样工作。

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

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

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

因此,吸取教训,始终检查您的中间清单(在调试或发布目录中找到),这将告诉您程序链接到的 DLL 版本。

希望它可以帮助任何人。

于 2009-08-25T12:10:38.290 回答
2

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

于 2010-09-17T05:41:08.047 回答