error - Cómo arreglar la dependencia de DWMAPI.DLL de carga de retraso bajo WinXP?
http dwmapi dll (4)
Construí un .dll bajo 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".
He leído cosas malas sobre las personas que intentaron desinstalar IE7, por lo que soy reacio a seguir ese camino.
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, entiendo esto al vincular:
LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll
.. y, por supuesto, no cambió nada cuando intentaba cargar mi 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, escribo un complemento Maya y obtengo el texto siempre útil en el editor de scripts:
// 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) //
Usé Dependency Walker para rastrear inicialmente el problema, y eso es lo que me llevó a DWMAPI.DLL. Estos son los mensajes que dependen de mí, y DWMAPI.DLL es lo único que tiene un signo de interrogación amarillo al lado:
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 tiene razón. 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.
Viendo que este problema no estaba relacionado con DWMAPI.DLL después de todo, pero DWMAPI es un problema común, publicaré aquí el mejor enlace que encontré sobre el problema de DWMAPI en el sitio web de Novell. 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.
Esto es complicado. En realidad, hay 2 formas principales de obtener este error.
1) Tiene su proyecto configurado para forzar la carga de los DLL cargados 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.
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 DLL de varios subprocesos.
Según su problema actualizado, DWMAPI.dll probablemente no es 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 punto, mi mejor opción es que usted tenga 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 DLL de varios subprocesos.
Además de eso, puedes intentar jugar con Dependency Walker para hacer que use las mismas rutas de búsqueda que Maya y ver si puedes 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.
Yo tenía exactamente este problema.
Un problema astuto que tardó horas en resolverse.
De todas formas. 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 lanzamiento se parchó automáticamente una noche hace un mes con el arreglo de vulnerabilidad ATL, al igual que todas las otras máquinas, excepto una máquina XP.
Esa máquina particulare XP tampoco pudo ejecutar la aplicación. Instalado el arreglo ATL (ver enlace a continuación), y voilá, todo funcionó igual que antes.
Entonces, la lección aprendida, siempre verifica tus manifiestos intermedios (encontrados en el directorio de depuración o liberación), que te dirá con qué versión de la DLL se ha vinculado el programa.
Espero que ayude a cualquiera.