Impossibile avviare correttamente l'applicazione (0xc000007b)


159

Ho un'app client / server che ho sviluppato su un singolo PC. Ora ha bisogno di due porte seriali, quindi ho preso in prestito un PC da un amico.

Quando creo la mia app e provo a eseguirla o eseguirne il debug (nell'IDE Delphi o dal file manager di Windows), si verifica un errore "Impossibile avviare correttamente l'applicazione (0xc000007b)".

Googling non fa apparire molto, ma sembra indicare che questo non è nulla di specifico di Delphi e succede con altre app. Sembra essere causato chiamando in una DLL a 32 bit da un'app a 64 bit o viceversa.

  • entrambi i PC sono Windows 7, 64 bit
  • entrambi hanno l'edizione di avviamento Delphi Xe2 che può gestire solo 32 bit
  • L'app funziona bene sul mio PC, ma non su quella del mio amico
  • Altre app Delphi funzionano perfettamente su entrambi i PC

Qualcuno può darmi un suggerimento su come rintracciarlo?


6
In una nota a margine , puoi usare com0com per installare porte seriali virtuali su un singolo PC. Ottimo per il debug e il test, basta creare 2 porte virtuali e collegarle insieme nella configurazione, quindi eseguire le app su ciascuna porta in modo che possano dialogare.
Remy Lebeau,

1
Hai controllato il registro eventi di Windows? A volte Windows fornisce ulteriori informazioni su quale DLL ha causato il fallimento dell'app.
Luis Carrasco

1
Sarà una DLL mancante che sospetto, di solito qualche utilità, o anche il gestore della memoria.
mj2008,

4
@ mj2008 DLL mancante dà un errore diverso: Impossibile avviare il programma perché XXXX.dll manca dal computer. Prova a reinstallare il programma per risolvere questo problema.
David Heffernan,

3
@snd Questo errore è STATUS_INVALID_IMAGE_FORMAT. Non si ottiene quando il sistema non riesce a trovare una DLL con quel nome. Si ottiene STATUS_INVALID_IMAGE_FORMATquando è possibile trovare una DLL, ma è corrotta o ha un testimone errato.
David Heffernan,

Risposte:


133

Per iniziare, suggerirei di verificare se esiste un problema tra l'applicazione e le sue dipendenze utilizzando il walker delle dipendenze


31
in base ai codici di errore di Windows ( google.de/… ), questo codice di errore indica: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
mox,

95
Il che è una buona indicazione del fatto che l'app a 32 bit ha tentato di caricare una DLL a 64 bit.
Remy Lebeau,

4
È un dato di fatto, questo file Pdf codice di errore è una fonte eccellente.
mox,

4
+1 e la risposta. Grazie, walker dipendenza ha salvato la giornata. Ho sostituito una DLL a 64 bit con una versione a 32 bit e ora funziona.
Mawg dice di ripristinare Monica

6
Assicurati di avere la versione corretta di Dependency Walker. La x86 dipende mostrerà risultati errati per i binari x64.
Andreas Haferburg,

53

Non è stato possibile risolvere una dipendenza del tempo di caricamento. Il modo più semplice per eseguire il debug è utilizzare Dependency Walker . Utilizzare l'opzione Profilo per ottenere l'output di diagnostica del processo di caricamento. Ciò identificherà il punto di errore e dovrebbe guidare l'utente a una soluzione.

La causa più comune di questo errore è il tentativo di caricare una DLL a 64 bit in un processo a 32 bit o viceversa.


2
+1. Si noti inoltre che è necessario eseguire la versione a 32 bit di walker delle dipendenze e assicurarsi che tutte le DLL caricate siano a 32 bit. Se si tenta di eseguire il walker di dipendenza della versione a 64 bit, caricherà felicemente le DLL a 64 bit, come VCRedist, anche se si dispone anche delle versioni a 32 bit.
liorda,

12

È una DLL mancante. Probabilmente, la tua dll che funziona con le porte com ha una dipendenza dll irrisolta. È possibile utilizzare walker delle dipendenze e debugger di Windows. Controlla tutta la libreria mfc, per esempio. Inoltre, puoi usare nrCommlib: sono componenti fantastici che funzionano con le porte COM.


12

Ho provato tutte le cose qui specificate e ho trovato l'ennesima risposta. Ho dovuto compilare la mia applicazione con DLL a 32 bit. Avevo creato le librerie sia a 32 che a 64 bit, ma avevo PATHimpostato le librerie a 64 bit. Dopo aver ricompilato la mia domanda (anche con alcune modifiche nel mio codice) ho avuto questo temuto errore e ho lottato per due giorni. Alla fine, dopo aver provato diverse altre cose, ho cambiato il mio PATHper avere le DLL a 32 bit prima delle DLL a 64 bit (hanno gli stessi nomi). E ha funzionato. Lo sto solo aggiungendo qui per completezza.


9

Nelle risposte precedenti è stato menzionato che l'uso del Dipendent Walker è la strada da percorrere, nel mio caso (la mia applicazione continua a fallire con il codice di errore), Dipendent Walker ha mostrato alcune dll che NON sono rilevanti!

Alla fine ho capito che posso eseguire la profilazione andando al menu "profilo" e avvierà l'applicazione e si fermerà alla dll esatta che causa il problema! Ho scoperto che una dll a 32 bit è stata scelta a causa del percorso e l'ho risolta.

inserisci qui la descrizione dell'immagine


5

Di recente ho avuto un problema in cui stavo sviluppando un'applicazione (che utilizzava una porta seriale) e funzionava su tutte le macchine su cui l'ho testato, ma alcune persone hanno riscontrato questo errore.

Si scopre che tutte le macchine su cui si è verificato l'errore erano in esecuzione Win7 x64 e non erano mai state aggiornate.

L'esecuzione di un aggiornamento di Windows ha risolto tutti i problemi nel mio caso particolare.


5

Ho riscontrato lo stesso problema durante lo sviluppo di un'app client-server utilizzando Microsoft Visual Studio 2012.

Se hai utilizzato Visual Studio per sviluppare l'app, devi assicurarti che il nuovo (ovvero il computer su cui non è stato sviluppato il software) abbia il pacchetto ridistribuibile Microsoft Visual C ++ appropriato. Se necessario, sono necessari l'anno e la versione di bit corretti (ovvero x86 per 32 bit e x64 per 64 bit) del pacchetto ridistribuibile Visual C ++.

I pacchetti ridistribuibili di Visual C ++ installano i componenti di runtime necessari per eseguire le applicazioni C ++ create utilizzando Visual Studio.

Ecco un collegamento a Visual C ++ ridistribuibile per Visual Studio 2015 .

Puoi controllare quali versioni sono installate andando su Pannello di controllo -> Programmi -> Programmi e funzionalità.

Ecco come ho ottenuto questo errore e risolto:

1) Ho sviluppato un'applicazione a 32 bit utilizzando Visual Studio 2012 sul mio computer. Chiamiamo il mio computer ComputerA.

2) Ho installato .exe e i relativi file su un altro computer che chiameremo ComputerB.

3) Su ComputerB, ho eseguito il file .exe e ho ricevuto il messaggio di errore.

4) Su ComputerB, ho esaminato Programmi e funzionalità e non ho visto Visual C ++ 2012 ridistribuibile (x64).

5) Su ComputerB, ho cercato su Google Visual C ++ 2012 ridistribuibile e selezionato e installato la versione x64.

6) Su ComputerB, ho eseguito .exe su ComputerB e non ho ricevuto il messaggio di errore.


3

In realtà questo errore indica un formato immagine non valido. Tuttavia, perché ciò sta accadendo e cosa significa in genere il codice di errore? In realtà questo potrebbe apparire quando si sta tentando di eseguire un programma che è stato progettato per funzionare con un sistema operativo Windows a 64 bit, ma il computer è in esecuzione sul sistema operativo a 32 bit.

Possibili ragioni:

  • Microsoft Visual C ++
  • È necessario riavviare
  • DirectX
  • .NET Framework
  • È necessario reinstallare
  • È necessario eseguire l'applicazione come amministratore

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


2

Questo potrebbe essere un caso in cui il debug del debugger potrebbe essere utile. In sostanza, se segui le istruzioni qui , puoi eseguire due ide e uno eseguirà il debug nell'altro. Se annulli l'applicazione in una, a volte puoi rilevare errori che altrimenti perdi. Vale la pena provarlo.


2
Questo è quasi certamente un errore segnalato dal caricatore e quindi si verifica prima dell'avvio del processo. Quindi il debug non sarebbe un'opzione. Naturalmente, potrei sbagliarmi nella mia diagnosi che l'errore è stato sollevato dal caricatore.
David Heffernan,

2

Ho visto l'errore nel tentativo di eseguire il debug di VC ++ eseguibile su un computer su cui non era installato Visual C ++. Costruire una versione di rilascio e utilizzarla per risolverlo.


2

Nel mio caso l'errore si è verificato quando ho rinominato una DLL dopo averla creata (usando Visual Studio 2015), in modo che corrisponda al nome previsto da un eseguibile, che dipendeva dalla DLL. Dopo la ridenominazione, l'elenco dei simboli esportati visualizzato da Dependency Walker era vuoto e veniva visualizzato il messaggio di errore "Impossibile avviare correttamente l'applicazione".

Quindi potrebbe essere risolto modificando il nome del file di output nelle opzioni del linker di Visual Studio.


2

Puoi avere questo se stai provando a manifestare la tua applicazione che ha una dipendenza dall'assembly Microsoft.Windows.Common-Controls . A tale scopo, quando si desidera caricare la versione 6 della libreria dei controlli comuni, in modo che gli stili di visualizzazione vengano applicati ai controlli comuni.

Probabilmente hai seguito la documentazione originale di Microsoft fin dai giorni di Windows XP e hai aggiunto quanto segue al manifest dell'applicazione:

<!-- 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 non è più il sistema operativo e non sei più un'applicazione a 32 bit. Nei successivi 17 anni Microsoft ha aggiornato la sua documentazione ; ora è il momento di aggiornare il tuo manifest:

<!-- 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 ha una bella storia dei controlli comuni:


3
"Windows XP non è più il sistema operativo" ha reso la mia giornata: D
Victoria il

Ma ho fatto questa domanda nel '12: allora le app di Windows avevano anche manifest?
Mawg dice di ripristinare Monica il

1
@Mawg Questo potrebbe essere o meno correlato al tuo problema. Ma con Stackoverflow è una combinazione di wiki e reddit per conoscenza; è una buona notizia sapere per l'errore esatto che hai segnalato. Detto questo, le app di Windows hanno avuto manifest di assembly che risalgono a Windows 2000; e a partire da Windows XP non otterresti più l'ultima versione di comctl32.dll a meno che il manifest dell'assembly non abbia dichiarato una dipendenza da esso.
Ian Boyd,

1

Ho appena risolto questo problema per il mio progetto personale (grazie a Dries per quello). Per me è stato perché il percorso del progetto era troppo lungo. Dopo aver salvato .sln in un percorso più breve (C: / MyProjects) e compilato da lì, è stato eseguito senza errori.


1
@jojodmo: in realtà, "Per me è stato perché il percorso del progetto era troppo lungo" mi sembra essere un valido contributo alla caccia agli insetti ...
Christian Severin,


1

Ho appena incontrato questo problema. Ho cercato "C ++" sotto "App e funzionalità" nel pannello di controllo di Windows 10 e ho notato che qualche tipo di aggiornamento era appena stato eseguito pochi giorni prima e installato VC ++ Redistributable 2012-2017. L'app che era in esecuzione nel messaggio di errore richiedeva solo VC ++ 2010. Ho disinstallato tutti e quindi reinstallato solo 2010 x86 / x64, e l'errore è andato via e l'applicazione ha funzionato come previsto.


1

Ciò può accadere se per qualche motivo una risorsa x86 viene caricata da una macchina x64. Per evitarlo esplicitamente, aggiungi questa direttiva del preprocessore a stdafx.h (ovviamente, nel mio esempio la risorsa problematica è la DLL dei controlli comuni di 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

1
I controlli comuni fanno parte del sistema operativo. Il sistema operativo sa da dove caricare la versione corretta. Questo non fa nulla per risolvere il problema del PO. Non installa nemmeno una dipendenza. Tutto ciò che fa è compilare una risorsa manifest nell'applicazione per utilizzare la versione 6 dei controlli comuni. Anche il condizionale del preprocessore non è necessario. Basta impostare processorArchitecture='*'e questo è tutto.
Indispensabile dal

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.