La aplicación no pudo iniciarse correctamente (0xc000007b)

159

Tengo una aplicación cliente / servidor que he estado desarrollando en una sola PC. Ahora necesita dos puertos seriales, así que tomé prestada una PC de un amigo.

Cuando construyo mi aplicación e intento ejecutarla o depurarla (ya sea en Delphi IDE o desde el Administrador de archivos de Windows), se produce el error "La aplicación no pudo iniciarse correctamente (0xc000007b)".

Buscar en Google no muestra mucho, pero parece indicar que esto no es específico de Delphi y sucede con otras aplicaciones. Parece ser causado al llamar a un archivo DLL de 32 bits desde una aplicación de 64 bits o viceversa.

  • ambas PC son Windows 7, 64 bit
  • ambos tienen la edición de inicio Delphi Xe2 que solo puede manejar 32 bits
  • La aplicación funciona bien en mi PC, pero no en la de mi amigo
  • Otras aplicaciones de Delphi funcionan bien en ambas PC

¿Alguien puede darme una pista sobre cómo rastrear esto?

Mawg dice que reinstalar a Mónica
fuente
66
Como nota al margen, puede usar com0com para instalar puertos seriales virtuales en una sola PC. Ideal para depurar y probar, solo cree 2 puertos virtuales y vincúlelos en la configuración, luego ejecute sus aplicaciones en cada puerto para que puedan comunicarse entre sí.
Remy Lebeau
1
¿Revisó el registro de eventos de Windows? A veces, Windows proporciona más información sobre qué DLL hizo que la aplicación fallara.
Luis Carrasco
1
Sospecho que falta una DLL, generalmente alguna utilidad, o incluso el administrador de memoria.
mj2008
44
@ mj2008 DLL faltante da un error diferente: el programa no puede iniciarse porque falta XXXX.dll en su computadora. Intente reinstalar el programa para solucionar este problema.
David Heffernan
3
@snd Este error es STATUS_INVALID_IMAGE_FORMAT. No se obtiene eso cuando el sistema no puede encontrar una DLL con ese nombre. Se obtiene STATUS_INVALID_IMAGE_FORMATcuando se puede encontrar una DLL, pero está dañada o tiene la bitness incorrecta.
David Heffernan

Respuestas:

133

Para comenzar, sugeriría probar si hay un problema entre su aplicación y sus dependencias usando el caminante de dependencias

mox
fuente
31
basado en los códigos de error de Windows ( google.de/… ), este código de error significa: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
mox
95
Lo cual es una buena indicación de que la aplicación de 32 bits intentó cargar una DLL de 64 bits.
Remy Lebeau
44
De hecho, este archivo PDF de código de error es una fuente excelente.
mox
44
+1 y la respuesta. Gracias, el caminante de la dependencia salvó el día. Reemplacé una DLL de 64 bits con una versión de 32 bits y ahora funciona.
Mawg dice que reinstalar a Monica
66
Asegúrese de tener la versión correcta de Dependency Walker. El x86 depende mostrará resultados incorrectos para binarios x64.
Andreas Haferburg
53

No se pudo resolver una dependencia del tiempo de carga. La forma más fácil de depurar esto es usar Dependency Walker . Use la opción Perfil para obtener resultados de diagnóstico del proceso de carga. Esto identificará el punto de falla y debería guiarlo hacia una solución.

La causa más común de este error es intentar cargar una DLL de 64 bits en un proceso de 32 bits, o viceversa.

David Heffernan
fuente
2
+1. También tenga en cuenta que debe ejecutar la versión de 32 bits del caminante de dependencia y asegurarse de que todas las DLL cargadas sean de 32 bits. Si intenta ejecutar el caminante de dependencia de la versión de 64 bits, cargará felizmente las DLL de 64 bits, como VCRedist, incluso si también tiene sus versiones de 32 bits.
liorda
12

Es un dll faltante. Posiblemente, su dll que funciona con puertos com tiene una dependencia dll no resuelta. Puede usar el caminante de dependencia y el depurador de Windows. Verifique toda la biblioteca mfc, por ejemplo. Además, puede usar nrCommlib: son excelentes componentes para trabajar con puertos com.

Alex.kononov
fuente
12

Intenté todas las cosas especificadas aquí y encontré otra respuesta. Tuve que compilar mi aplicación con archivos DLL de 32 bits. Había construido las bibliotecas tanto en 32 bits como en 64 bits, pero tenía mi PATHconjunto en bibliotecas de 64 bits. Después de volver a compilar mi aplicación (con una serie de cambios en mi código también) recibí este temido error y luché durante dos días. Finalmente, después de probar varias otras cosas, cambié mi PATHpara tener las DLL de 32 bits antes que las DLL de 64 bits (tienen los mismos nombres). Y funcionó. Solo lo estoy agregando aquí para completar.

unxnut
fuente
9

Se ha mencionado en respuestas anteriores que usar el caminante de dependencia es el camino a seguir, en mi caso (mi aplicación sigue fallando con el código de error), ¡el caminante de dependencia mostró algunos dll que NO son relevantes!

Finalmente descubrí que puedo ejecutar la creación de perfiles yendo al menú "perfil" y ejecutará la aplicación y se detendrá en el dll exacto que causa el problema. Descubrí que se eligió un dll de 32 bits debido a la ruta y lo arreglé.

ingrese la descripción de la imagen aquí

pktCoder
fuente
5

Recientemente tuve un problema en el que estaba desarrollando una aplicación (que usaba un puerto serie) y funcionaba en todas las máquinas en las que lo probé, pero algunas personas estaban recibiendo este error.

Resulta que todas las máquinas en las que ocurrió el error estaban ejecutando Win7 x64 y NUNCA se habían actualizado UNA VEZ.

La ejecución de una actualización de Windows solucionó todas las máquinas en mi caso particular.

mitchfish36
fuente
5

Experimenté el mismo problema al desarrollar una aplicación cliente-servidor con Microsoft Visual Studio 2012.

Si usó Visual Studio para desarrollar la aplicación, debe asegurarse de que la nueva (es decir, la computadora en la que no se desarrolló el software) tenga el paquete redistribuible de Microsoft Visual C ++ apropiado. Según corresponda, necesita la versión correcta de año y bit (es decir, x86 para 32 bit y x64 para 64 bit) del paquete redistribuible de Visual C ++.

Los paquetes redistribuibles de Visual C ++ instalan los componentes de tiempo de ejecución necesarios para ejecutar aplicaciones C ++ creadas con Visual Studio.

Aquí hay un enlace a Visual C ++ Redistributable para Visual Studio 2015 .

Puede verificar qué versiones están instaladas en Panel de control -> Programas -> Programas y características.

Así es como obtuve este error y lo solucioné:

1) Desarrollé una aplicación de 32 bits usando Visual Studio 2012 en mi computadora. Llamemos a mi computadora ComputerA.

2) Instalé el .exe y los archivos relacionados en una computadora diferente que llamaremos ComputerB.

3) En ComputerB, ejecuté el .exe y recibí el mensaje de error.

4) En ComputerB, miré los Programas y Características y no vi Visual C ++ 2012 Redistributable (x64).

5) En ComputerB, busqué en Google Redistribuible de Visual C ++ 2012 y seleccioné e instalé la versión x64.

6) En ComputerB, ejecuté el .exe en ComputerB y no recibí el mensaje de error.

usuario3731622
fuente
3

En realidad, este error indica un formato de imagen no válido. Sin embargo, ¿por qué sucede esto y qué significa generalmente el código de error? En realidad, esto podría aparecer cuando intentas ejecutar un programa que está diseñado o está destinado a funcionar con un sistema operativo Windows de 64 bits, pero tu computadora está funcionando con un sistema operativo de 32 bits.

Posibles razones:

  • Microsoft Visual C ++
  • Necesito reiniciar
  • DirectX
  • .NET Framework
  • Necesito reinstalar
  • Necesita ejecutar la aplicación como administrador

Fuente: http://www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/

Resuelve101
fuente
2

Este puede ser un caso en el que la depuración del depurador puede ser útil. Esencialmente, si sigue las instrucciones aquí , puede ejecutar dos ide y uno se depurará en el otro. Si abre su aplicación en una, a veces puede detectar errores que de otro modo se perderían. Vale la pena intentarlo.

Toby Allen
fuente
2
Esto es casi seguro un error informado por el cargador y, por lo tanto, ocurre antes de que comience el proceso. Por lo tanto, la depuración no sería una opción. Por supuesto, puedo estar equivocado en mi diagnóstico de que el error es provocado por el cargador.
David Heffernan
2

He visto el error al intentar ejecutar el ejecutable de depuración de VC ++ en una máquina que no tenía instalado Visual C ++. Construir una versión de lanzamiento y usarla lo arregló.

Bill Greer
fuente
2

En mi caso, el error ocurrió cuando cambié el nombre de una DLL después de compilarla (usando Visual Studio 2015), de modo que se ajusta al nombre esperado por un ejecutable, que dependía de la DLL. Después del cambio de nombre, la lista de símbolos exportados que muestra Dependency Walker estaba vacía y se mostraba el mensaje de error "La aplicación no pudo iniciarse correctamente".

Por lo tanto, podría solucionarse cambiando el nombre del archivo de salida en las opciones del vinculador de Visual Studio.

nucleon
fuente
2

Puede tener esto si está intentando manifestar que su aplicación depende del ensamblado Microsoft.Windows.Common-Controls . Lo hace cuando desea cargar la Versión 6 de la biblioteca de controles comunes, de modo que los estilos visuales se apliquen a los controles comunes.

Probablemente siguió la documentación original de Microsoft desde los días de Windows XP y agregó lo siguiente al manifiesto de su aplicación:

<!-- Dependancy on Common Controls version 6 -->
<dependency>
    <dependentAssembly>
        <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
    </dependentAssembly>
</dependency>

Windows XP ya no es el sistema operativo, y ya no eres una aplicación de 32 bits. En los 17 años transcurridos, Microsoft actualizó su documentación ; ahora es tiempo de que actualices tu manifiesto:

<!-- Dependancy on Common Controls version 6 -->
<dependency>
    <dependentAssembly>
        <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
    </dependentAssembly>
</dependency>

Raymond Chen tiene una hermosa historia de los controles comunes:

Ian Boyd
fuente
3
"Windows XP ya no es el sistema operativo" me alegró el día: D
Victoria
Pero hice esta pregunta en el '12: ¿las aplicaciones de Windows incluso tenían manifiestos entonces?
Mawg dice que reinstalar a Monica el
1
@Mawg Esto puede o no estar relacionado con su problema. Pero con Stackoverflow siendo una combinación de wiki y reddit para el conocimiento; Es un buen dato saber el error exacto que informó. Dicho esto, las aplicaciones de Windows han tenido manifiestos de ensamblaje que se remontan a Windows 2000; y comenzando con Windows XP ya no obtendría la última versión de comctl32.dll a menos que su manifiesto de ensamblado declarara una dependencia de él.
Ian Boyd
1

Acabo de resolver este problema para mi proyecto personal (gracias a Dries por eso). Para mí fue porque la ruta del proyecto era demasiado larga. Después de guardar el .sln en una ruta más corta (C: / MyProjects) y compilar desde allí, se ejecutó sin el error.

usuario1539405
fuente
1
@jojodmo: en realidad, "para mí fue porque la ruta del proyecto era demasiado larga" me parece una contribución válida a la búsqueda de errores ...
Christian Severin
1

Acabo de encontrarme con este problema. Busqué "C ++" en mis "Aplicaciones y características" en el panel de control de Windows 10 y noté que algún tipo de actualización acababa de ejecutarse unos días antes e instalé VC ++ Redistributable 2012-2017. La aplicación que se estaba ejecutando en el mensaje de error solo requería VC ++ 2010. Los desinstalé todos y luego reinstalé solo 2010 x86 / x64, y el error desapareció y la aplicación funcionó como se esperaba.

Chris Putnam
fuente
1

Eso puede suceder si por alguna razón se carga un recurso x86 desde una máquina x64. Para evitarlo explícitamente, agregue esta directiva de preprocesador a stdafx.h (por supuesto, en mi ejemplo, el recurso problemático es la DLL de controles comunes de Windows.

#if defined(_WIN64)
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df'\"")
#endif
Michael Haephrati
fuente
1
Los controles comunes son parte del sistema operativo. El sistema operativo sabe desde dónde cargar la versión correcta. Esto no hace nada para resolver el problema del OP. Ni siquiera instala una dependencia. Todo lo que hace es compilar un recurso manifiesto en la aplicación para usar la versión 6 de los controles comunes. El preprocesador condicional tampoco es necesario. Simplemente configúrelo processorArchitecture='*', y eso es todo.
Inspectable el