views:

40499

answers:

6

I have built a .dll under WinXP that claims it can't find DWMAPI.DLL when it's loaded. The problem is that this DLL is a Vista DLL, and this a known issue for XP users that have IE7 installed. The recommendation is to uninstall IE7 or repair the .NET Framework via Add/Remove programs. I did the repair, and nothing changed. I'm not about to uninstall IE7 since there must be a better solution that's not the equivalent of "reinstall windows".

I've read bad things about people who attempted to uninstall IE7, so I'm reluctant to go that route.

I am using C++ under Visual Studio 2003 (7.1). I don't see an option where I may have forced delay loading at application launch. I just used default settings when I created the DLL project. I did just now find an interesting option, Linker->Input->Delay Loaded DLLs, so I put DWMAPI.DLL in there to force it to be delay-loaded. However, I get this when linking:

LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll

.. and it of course didn't change a thing when trying to load my DLL. For the heck of it, I added the whole tree of DLLs that lead to DWMAPI.DLL, and I get the same message. (For the record, it's foundation.dll->shell32.dll->shdocvw.dll->mshtml.dll->ieframe.dll->dwmapi.dll .)

To be more specific about what I'm doing, I am writing a Maya plugin and get the always-helpful text in the script editor:

// 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) //

I used Dependency Walker to initially track down the problem, and that's what lead me to DWMAPI.DLL. These are the message depends gives me, and DWMAPI.DLL is the only thing that has a yellow question mark next to it:

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.

Gerald is right. Maya is, in fact, using a different PATH than the Dependency Walker. My plug-in loads another DLL (for image processing) that lives in the Maya plug-ins directory and depends found it with no problem, but Maya didn't. I had to add ";plug-ins" to the PATH in Maya.env.

Seeing as this problem wasn't related to DWMAPI.DLL after all, but DWMAPI is a common problem, I'll post the best link I found about the DWMAPI issue on Novell's website here. Basically, most programs will have this warning in depends.exe, but if there is a delay-load icon next to it, and you are sure that the program won't directly or indirectly call DWMAPI, then it's fine. The problem is elsewhere. If the delay-load icon isn't present, then you have to look at the /DELAY and /DELAYLOAD options in Visual Studio. The fact that depends gave me a "warning" and not an "error" was a clue to the fact that DWMAPI is not being loaded automatically.

+3  A: 

This is a tricky one. There's really 2 main ways you will get this error.

1) You have your project set to force delay loaded DLLs to load at application launch. DWMAPI.dll is a delay-loaded DLL and thus normally will not be loaded unless one of it's functions is called. That won't happen on XP unless you're trying to do it in your DLL. But it's possible to set a compiler option to force your app to load the delay loaded DLLs anyway. If you're doing that, don't.

2) It's often a false error that you will get from depends.exe when there is another problem. Run your DLL through dependency walker and see if there are any other dependency problems. If all else fails, try uninstalling IE7 and see if the problem persists. If it is a false error, after you install IE7 you will see the real error. You can install IE7 again afterwards.

Gerald
+5  A: 

Based on your updated problem, DWMAPI.dll is probably not your problem. Dependency walker will always give you that error whenever you are linking to mshtml as it always checks delay loaded DLLs.

At this point my best guess is that you have your project set to dynamically load the runtime libraries and the search path for DLLs is being changed by Maya. So it may be unable to find the MSVC runtime DLL(s). I haven't developed Maya plugins in a long time, but I've had that problem with other apps that have plugin DLLs recently.

Try changing your setting in C/C++->Code Generation->Runtime Library to Multi-Threaded rather than Multi-Threaded DLL.

Aside from that you can try fiddling with Dependency Walker to make it use the same search paths as Maya and see if you can come up with another dependency problem.

As a last resort you can launch Maya in a debugger and set a breakpoint on LoadLibrary and find out which library is not being loaded that way.

Gerald
Not to be a necromancer on the thread, having just debugged this same problem I just wanted to add something. If you find that your dll is statically linked, (as Gerald suggests) and you're still having this issue load your dll with Visual Studio and check its manifest. If the project was created by someone else, they may have included a .manifest file which embeds in the binary what its dependencies are, and the OS will claim there's a problem when it can't find these, even if the DLL is statically linked. If you find the .manifest, comment these and recompile, it may fix the issue.
JPDecker
A: 

This is all great information (and hopefully the /DELAYLOAD:dwmapi.dll solution works for people) - but how would a VS 2008 Visual BASIC developer specify this (or something like it) ?

Please note that I've posted a question on MSDN asking essentially the same thing. You can see it (& hopefully answers).

Thank you, Steven.

+2  A: 

I had exactly this problem.

Sneaky problem that took hours to solve.

Anyway. I compiled my managed C++ application on the release machine. Got complaints from customers that could not run it, worked like a charm on all of our machines.

It turned out that the release machine was automatically patched one night a month ago with the ATL vulnerability fix, and so was all other machines also, except one XP machine.

That particulare XP machine could not run the application either. Installed the ATL fix (see link below), and voilá, every thing worked just like before.

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

So lesson learned, always check your intermediate manifests (found the in debug or release directory), that will tell you what version of the DLL that the program have been linked against.

Hope it helps anyone.

RA
A: 

Hello RA,

Your information about the "Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package ATL Security Update" (knowledge base article KB973544) and the link to the Microsoft web page was very helpful. Thank you for posting the information. We had the same application error when running a Fortran program on another computer. The program ran fine on the development computer. I downloaded the "vcredist_x86.exe" from the MS web page, installed it on the other computer, and the program runs correctly.

I had used the dependency walker (depends.exe) to check for missing DLLs that the program wasn't finding on the other computer. One was the MSVCR80.dll, which appears to now have been updated and can be found after running the vcredist_x86.exe.

Regards, Greg

Greg
A: 

Try changing your setting in C/C++->Code Generation->Runtime Library to Multi-Threaded rather than Multi-Threaded DLL.