Cómo arreglar DWMAPI.DLL delay-cargar dependencia bajo WinXP?


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

He leído cosas malas sobre la gente que intentó desinstalar IE7, así que soy reacio a ir por esa ruta.

Estoy usando C++ bajo Visual Studio 2003 (7.1). No veo una opción en la que pueda haber forzado la carga de retraso en el inicio de la aplicación. Solo usé la configuración predeterminada cuando creé el proyecto DLL. Acabo de encontrar una opción interesante, Enlazador - > Entrada - >Delay DLLs cargados, así que puse DWMAPI.DLL ahí para forzarlo a ser cargado con retraso. Sin embargo, obtengo esto al enlazar:

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

.. y, por supuesto, no cambió un cosa al intentar cargar mi DLL. Para el heck de él, agregué el árbol entero de DLLs que conducen a DWMAPI.DLL, y recibo el mismo mensaje. (Para que conste, es la fundación.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 Maya y obtener 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 el mensaje depende me da, 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.
[3] Gerald tiene razón. Maya está, de hecho, usando un CAMINO diferente que el Andador de la Dependencia. Mi plug-in carga otra DLL (para el procesamiento de imágenes) que vive en el directorio de plug-ins de Maya y depende lo encontró sin problema, 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, voy a publicar el mejor enlace que encontré sobre el problema DWMAPI en el sitio web de Novell aquí. Básicamente, la mayoría de los programas tendrán esta advertencia en depends.exe, pero si hay un icono de delay-load 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 icono delay-load no está presente, entonces tiene que mirar las opciones /DELAY y /DELAYLOAD en Visual Studio. El hecho de que depende me dio un "warning "y no un" error " fue una pista del hecho de que DWMAPI no se está cargando automáticamente.

Author: Jim Buck, 2008-10-06

4 answers

Basado en su problema actualizado, DWMAPI.dll probablemente no es su problema. Dependency walker siempre le dará ese error cada vez que esté enlazando a mshtml, ya que siempre comprueba las DLL cargadas con retraso.

En este punto mi mejor conjetura es que tienes tu proyecto configurado para cargar dinámicamente las bibliotecas de tiempo de ejecución y la ruta de búsqueda para DLL está siendo cambiada por Maya. Por lo tanto, es posible que no pueda encontrar la(s) DLL (s) de tiempo de ejecución de MSVC. No he desarrollado plugins Maya en mucho tiempo, pero he tenido que problema con otras aplicaciones que tienen DLL plugin 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 Multi-Threaded.

Aparte 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 es ser cargado de esa manera.

 7
Author: Gerald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-06 21:46:26

Esto es complicado. Realmente hay 2 formas principales de obtener este error.

1) Tiene su proyecto configurado para forzar que las DLL cargadas delay se carguen al iniciar la aplicación. DWMAPI.dll es un DLL cargado con retraso y por lo tanto normalmente no se cargará a menos que se llame a una de sus funciones. Eso no sucederá en XP a menos que esté tratando de hacerlo en su DLL. Pero es posible establecer una opción de compilador para forzar a su aplicación a cargar las DLL cargadas delay 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 dependency walker y vea si hay otros problemas 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 de nuevo después.

 3
Author: Gerald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-06 08:06:48

Tuve exactamente este problema.

Problema astuto que tardó horas en resolverse.

De todos modos. Compilé mi aplicación C++ administrada en la máquina de lanzamiento. Recibió quejas de clientes que no podían ejecutarlo, funcionó como un encanto en todas nuestras máquinas.

Resultó que la máquina de liberación se parcheó automáticamente una noche hace un mes con la corrección de la vulnerabilidad ATL, y también lo fueron todas las demás máquinas, excepto una máquina XP.

Esa máquina XP particular podría no ejecute la aplicación tampoco. Instalado el ATL fix (ver enlace a continuación), y voilá, todo funcionaba igual que antes.

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

Así que lección aprendida, siempre revise sus manifiestos intermedios (encontrado en el directorio de depuración o liberación), que le dirá qué versión de la DLL que el programa se han vinculado contra.

Espero que ayude a alguien.
 3
Author: ROAR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-25 12:10:38

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 Multi-Threaded.

 2
Author: user450279,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-17 05:41:08