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

时间:2008-10-06 07:14:15

标签: 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 ++。我没有看到我可能在应用程序启动时强制延迟加载的选项。我刚刚创建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使用的是与Dependency Walker不同的PATH。我的插件加载了另一个DLL(用于图像处理),它存在于Maya插件目录中并且依赖于它没有问题,但是Maya没有。我不得不在Maya.env中为PATH添加“;插件”。

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

4 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:3)

这是一个棘手的问题。有两种主要方法可以解决这个错误。

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

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

答案 2 :(得分:3)

我确实遇到了这个问题。

需要花费数小时才能解决的偷偷摸摸的问题。

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

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

特别是XP机器也无法运行该应用程序。安装了ATL修复程序(参见下面的链接),并且瞧,每件事情都像以前一样工作。

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

所以吸取教训,总是检查你的中间清单(在调试或发布目录中找到),它会告诉你该程序被链接到哪个版本的DLL。

希望它可以帮助任何人。

答案 3 :(得分:2)

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