2008-10-06 10 views
27

He creado un .dll en WinXP que afirma que no puede encontrar DWMAPI.DLL cuando está cargado. El problema es que esta DLL es una DLL de Vista, y este es un problema conocido para los usuarios de XP que tienen instalado IE7. La recomendación es desinstalar IE7 o reparar .NET Framework a través de Agregar/Quitar programas. Hice la reparación, y nada cambió. No voy a desinstalar IE7 ya que debe haber una solución mejor que no sea el equivalente a "reinstalar Windows".Cómo reparar la dependencia de carga de retraso DWMAPI.DLL en WinXP?

He leído cosas malas sobre las personas que intentaron desinstalar IE7, por lo que soy reacio a seguir esa ruta.

Estoy usando C++ en Visual Studio 2003 (7.1). No veo una opción en la que pueda haber forzado la demora de carga en el inicio de la aplicación. Acabo de usar la configuración predeterminada cuando creé el proyecto DLL. Recientemente encontré una opción interesante, Linker-> Input-> Delay Loaded DLLs, así que puse DWMAPI.DLL ahí para forzar que se cargue con retraso. Sin embargo, me sale esto al vincular:

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

.. y por supuesto no cambiaría nada cuando se trata de cargar mi archivo DLL. Por pura casualidad, agregué todo el árbol de archivos DLL que llevan a DWMAPI.DLL, y recibo el mismo mensaje. (Para el registro, es foundation.dll-> shell32.dll-> shdocvw.dll-> mshtml.dll-> ieframe.dll-> dwmapi.dll.)

Para ser más específico sobre lo que estoy haciendo , estoy escribiendo un plugin de Maya y obtener el texto siempre útil en el editor de script:

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

solía Dependency Walker para rastrear inicialmente por el problema, y ​​eso es lo que me llevó a dwmapi.dll. Estos son los mensajes depende me da, y dwmapi.dll es el único que tiene un signo de interrogación amarillo junto a él:

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 es correcto. Maya está, de hecho, usando un PATH diferente al Dependency Walker. Mi complemento carga otra DLL (para procesamiento de imágenes) que vive en el directorio de plug-ins de Maya y depende de que no la encontró, pero Maya no lo hizo. Tuve que agregar "; plug-ins" a la RUTA en Maya.env.

Al ver que este problema no estaba relacionado con DWMAPI.DLL después de todo, pero DWMAPI es un problema común, publicaré el mejor enlace que encontré sobre el problema DWMAPI en el sitio web de Novell here. Básicamente, la mayoría de los programas tendrán esta advertencia en depends.exe, pero si hay un ícono de carga de espera junto a él, y está seguro de que el programa no llamará directa o indirectamente a DWMAPI, entonces está bien. El problema está en otra parte. Si el ícono de carga diferida no está presente, entonces tiene que mirar las opciones/DELAY y/DELAYLOAD en Visual Studio. El hecho de que eso dependiera me dio una "advertencia" y no un "error" fue una pista sobre el hecho de que DWMAPI no se está cargando automáticamente.

+1

Apagué este problema en uno de nuestros servidores de Windows 2003. Es solo una maldita aplicación de consola y aún así (o alguna otra dependencia) dice querer también dwmapi.dll. Me encantaría ver una respuesta definitiva a esto. +1. – Kev

+0

Creo que muchas de las vistas son de Google drive-bys. Simplemente buscar en "dwmapi.dll" tiene esto como el segundo resultado. –

Respuesta

7

Según su problema actualizado, DWMAPI.dll probablemente no sea su problema. Dependency walker siempre le dará ese error cada vez que establezca un enlace a mshtml, ya que siempre verifica las DLL cargadas con retraso.

En este momento mi mejor estimación es que tiene su proyecto configurado para cargar dinámicamente las bibliotecas de tiempo de ejecución y Maya está cambiando la ruta de búsqueda de archivos DLL. Por lo tanto, es posible que no pueda encontrar la (s) DLL (s) de tiempo de ejecución de MSVC. No he desarrollado complementos de Maya en mucho tiempo, pero he tenido ese problema con otras aplicaciones que tienen DLL de plugins recientemente.

Intente cambiar su configuración en C/C++ -> Generación de código-> Biblioteca de tiempo de ejecución a Multi-Threaded en lugar de Multi-Threaded DLL.

Aparte de eso, puede intentar jugar con Dependency Walker para que utilice las mismas rutas de búsqueda que Maya y vea si puede encontrar otro problema de dependencia.

Como último recurso, puede iniciar Maya en un depurador y establecer un punto de interrupción en LoadLibrary y averiguar qué biblioteca no se está cargando de esa manera.

+0

Para no ser un nigromante en el hilo, después de haber depurado este mismo problema, solo quería agregar algo. Si encuentra que su dll está vinculado estáticamente, (como sugiere Gerald) y todavía tiene este problema, cargue su dll con Visual Studio y verifique su manifiesto. Si el proyecto fue creado por otra persona, pueden haber incluido un archivo .manifest que incrusta en el binario cuáles son sus dependencias, y el sistema operativo afirmará que hay un problema cuando no puede encontrarlos, incluso si el archivo DLL está vinculado estáticamente . Si encuentra el .manifest, coméntelo y vuelva a compilar, puede solucionar el problema. – Decker

3

Esto es complicado. En realidad, hay 2 formas principales de obtener este error.

1) Tiene su proyecto configurado para forzar la carga de las DLL cargadas al inicio de la aplicación. DWMAPI.dll es una DLL cargada con retraso y, por lo tanto, normalmente no se cargará a menos que se invoque una de sus funciones. Eso no sucederá en XP a menos que intente hacerlo en su DLL. Pero es posible establecer una opción de compilación para obligar a su aplicación a cargar los DLL cargados de retraso de todos modos. Si estás haciendo eso, no lo hagas.

2) A menudo es un error falso que obtendrá de depends.exe cuando hay otro problema. Ejecute su DLL a través de la herramienta de migración de dependencias y vea si hay algún otro problema de dependencia. Si todo lo demás falla, intente desinstalar IE7 y vea si el problema persiste. Si es un error falso, después de instalar IE7, verá el error real. Puede instalar IE7 nuevamente luego.

3

Tuve exactamente este problema.

Problema furtivo que tardó horas en resolverse.

De todos modos. Recopilé mi aplicación C++ administrada en la máquina de lanzamiento. Recibí quejas de los clientes que no podían ejecutarlo, funcionaba como un amuleto en todas nuestras máquinas.

Resultó que la máquina de liberación se parchó automáticamente una noche hace un mes con el arreglo de vulnerabilidad ATL, al igual que todas las demás máquinas, excepto una máquina XP.

Esa máquina XP particular tampoco pudo ejecutar la aplicación. Instalado el arreglo ATL (ver enlace a continuación), y voilá, todo funcionó igual que antes.

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

Así lección aprendida, siempre verifique que se manifiesta intermedios (que se encuentra en la depuración o la liberación de directorio), que le dirá qué versión de la DLL que el programa se han relacionado en contra.

Espero que ayude a cualquiera.

2

Intente cambiar su configuración en C/C++ -> Generación de código-> Biblioteca de tiempo de ejecución en DLL de varios hilos en lugar de DLL de varios subprocesos.

+0

esto funcionó para mí, gracias –

Cuestiones relacionadas