Pregunta

He construido un .dll bajo WinXP que dice que no puede encontrar DWMAPI.DLL cuando está cargado. El problema es que esta DLL es una DLL de Vista, y esto es un problema conocido para los usuarios de XP que tienen IE7 instalado. La recomendación es desinstalar IE7 o reparar .NET Framework a través de Agregar o 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 equivalente a " reinstalar Windows " ;.

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

Estoy usando C ++ en Visual Studio 2003 (7.1). No veo una opción en la que pueda haber forzado el retraso en la carga al iniciar la aplicación. Acabo de usar la configuración predeterminada cuando creé el proyecto DLL. Acabo de encontrar una opción interesante, Linker- > Input- > Delay Loaded DLLs, así que puse DWMAPI.DLL allí 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 cambió nada al intentar cargar mi DLL. Para mayor detalle, agregué todo el árbol de 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 complemento de 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 de los que depende, 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, utilizando un PATH diferente al del Caminante de Dependencia. Mi complemento carga otro DLL (para el procesamiento de imágenes) que se encuentra en el directorio de complementos de Maya y depende de que lo haya encontrado sin ningún problema, pero Maya no lo hizo. Tuve que agregar " ;; plug-ins " al PATH en maya.env.

Después de todo, como este problema no estaba relacionado con DWMAPI.DLL, pero DWMAPI es un problema común, publicaré el mejor enlace que encontré sobre el problema de 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 ícono de carga de demora al lado, 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 de demora de carga no está presente, entonces debe mirar las opciones / DELAY y / DELAYLOAD en Visual Studio. El hecho de que dependa me dio una " advertencia " y no un " error " fue una pista para el hecho de que DWMAPI no se está cargando automáticamente.

¿Fue útil?

Solución

Según su problema actualizado, DWMAPI.dll probablemente no sea su problema. Dependency walker siempre te dará ese error cuando estés vinculando a mshtml, ya que siempre verifica los archivos DLL cargados 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 Maya está cambiando la ruta de búsqueda de DLL. Por lo tanto, es posible que no pueda encontrar las DLL de tiempo de ejecución de MSVC. No he desarrollado los complementos de Maya en mucho tiempo, pero he tenido ese problema con otras aplicaciones que tienen DLL de complementos recientemente.

Intente cambiar su configuración en C / C ++ - > Code Generation- > Runtime Library a Multi-Threaded en lugar de Multi-Threaded DLL.

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 descubrir qué biblioteca no se está cargando de esa manera.

Otros consejos

Esto es complicado. Hay realmente 2 formas principales de que obtengas este error.

1) Tiene su proyecto configurado para forzar el retraso de las DLL cargadas para que se carguen al iniciar la aplicación. DWMAPI.dll es una DLL cargada por demora 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é intentando hacerlo en su DLL. Pero es posible configurar una opción de compilador para forzar a su aplicación a cargar las DLL cargadas con demora 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 del caminante de dependencias 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. Puedes instalar IE7 de nuevo después.

Tuve exactamente este problema.

Problema astuto que tomó horas resolverlo.

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

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

Esa máquina particulare XP tampoco pudo ejecutar la aplicación. Instalé el arreglo ATL (ver enlace a continuación), y voilá, todo funcionó como antes.

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

Entonces, lección aprendida, siempre revise sus manifiestos intermedios (que se encuentran en el directorio de depuración o versión), que le indicarán en qué versión de la DLL se ha vinculado el programa.

Espero que ayude a alguien.

Intente cambiar su configuración en C / C ++ - > Code Generation- > Runtime Library a Multi-Threaded en lugar de Multi-Threaded DLL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top