2012-05-08 4 views
129

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.L'applicazione non è stata avviata correttamente (0xc000007b)

Quando costruisco la mia app e provo a eseguirla o eseguirne il debug (sia nell'IDE di Delphi o dal gestore di file di Windows), si sbaglia "L'applicazione non è stata avviata correttamente (0xc000007b)".

Googling non mostra molto, ma sembra indicare che questo non è specifico di Delphi e si verifica con altre app. Sembra essere causato dalla chiamata in una DLL a 32 bit da un'app 64 bit o viceversa.

  • entrambi i PC sono Windows 7, 64 bit
  • entrambi hanno edizione Delphi XE2 antipasto che può gestire solo 32 bit
  • L'applicazione funziona benissimo sul mio PC, ma non su di un mio amico
  • Altro Delphi le app funzionano perfettamente su entrambi i PC

Qualcuno può darmi un suggerimento su come rintracciare questo verso il basso?

+5

Su un lato nota, è possibile usare [com0com] (http://com0com.sourceforge.net) per installare porte seriali virtuali su un singolo PC. Ottimo per debug e test, basta creare 2 porte virtuali e collegarle insieme nella configurazione, quindi eseguire le tue app su ogni porta in modo che possano parlare tra loro . –

+1

hai controllato i Eventi di Windows Login? a volte Windows fornisce ulteriori informazioni riguardanti la quale DLL ha reso l'applicazione sicuro. –

+1

sarà una DLL mancante di cui ho il sospetto, di solito qualche utilità, o anche il gestore di memoria. – mj2008

risposta

114

Per iniziare, vorrei suggerire di verificare se c'è un problema tra l'applicazione e le sue dipendenze utilizzando dependency walker

+24

sulla base dei codici di errore di Windows (http://www.google.de/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=1&ved=0CIYBEBYwAA&url=http%3A%2F%2Fdownload.microsoft.com% 2Fdownload% 2F9% 2F5% 2FE% 2F95EF66AF-9026-4BB0-A41D-A4F81802D92C% 2F% 5BMS-ERREF% 5D.pdf & ei = 17GoT53mCK_R4QSGm6WRCQ & USG = AFQjCNHu2-WVJpA7ViG5e-GAne_gCH9Rzw & SIG2 = f1N9anRoFy8qDuth62oK7g), questo codice di errore significa: 0xc000007b STATUS_INVALID_IMAGE_FORMAT. – mox

+78

Quale è una buona indicazione che l'applicazione a 32 bit ha provato a caricare una DLL a 64 bit. –

+3

In effetti, questo file Pdf di codice di errore è una fonte eccellente. – mox

42

A carico del tempo di dipendenza non può essere risolto. Il modo più semplice per eseguire il debug di questo è utilizzare Dependency Walker. Utilizzare l'opzione Profilo per ottenere l'output di diagnostica del processo di caricamento. Questo identificherà il punto di errore e dovrebbe guidarti verso 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.

+0

+1. Si noti inoltre che è necessario eseguire la versione a 32 bit del Dipendente Walker e assicurarsi che tutte le DLL caricate siano a 32 bit. Se si tenta di eseguire il Dipendente Walker versione 64 bit, caricherà felicemente le DLL a 64 bit, come VCRedist, anche se anche le versioni a 32 bit. – liorda

2

Questo può essere un caso in cui il debug del debugger potrebbe essere utile. Essenzialmente se segui lo instructions here puoi eseguire due ide e uno eseguirà il debug nell'altro. Se unisci la tua applicazione in una, a volte puoi rilevare errori che altrimenti ti mancheranno. Vale la pena provarlo.

+2

Questo è quasi certamente un errore segnalato dal caricatore e quindi si verifica prima dell'inizio del processo. Quindi il debug non sarebbe un'opzione. Certo, potrei sbagliarmi nella mia diagnosi che l'errore è stato sollevato dal loader. –

12

Si tratta di una dll mancante. Probabilmente, la tua DLL che funziona con le porte COM ha una dipendenza di DLL non risolta. È possibile utilizzare Dipendente Walker e Windows Debugger. Controlla tutta la libreria mfc, per esempio. Inoltre, è possibile utilizzare nrCommlib: è un ottimo componente funzionare con le porte COM.

5

Recentemente ho avuto un problema in cui stavo sviluppando un'applicazione (che utilizzava una porta seriale) e ha funzionato su tutte le macchine su cui l'ho provata, ma alcune persone hanno ricevuto questo errore.

Si scopre che tutte le macchine su cui si è verificato l'errore eseguivano Win7 x64 e non si erano MAI UNA VOLTE aggiornate.

L'esecuzione di un aggiornamento di Windows ha risolto tutte le macchine nel mio caso particolare.

2

Ho visto l'errore nel tentativo di eseguire eseguibile di debug VC++ su una macchina che non aveva Visual C++ installato. Costruire una versione di rilascio e usarlo lo ha risolto.

1

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

+1

@jojodmo: in realtà, "Per me è stato perché il percorso del progetto era troppo lungo" mi sembra un valido contributo alla caccia al bug ... –

3

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

Possibili motivi:

  • Microsoft Visual C++
  • necessario riavviare
  • DirectX
  • .NET Framework
  • Hai bisogno di 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/

9

Ho provato tutte le cose specificate qui e ho trovato ancora un'altra risposta. Ho dovuto compilare la mia applicazione con DLL a 32 bit. Avevo costruito le librerie sia a 32-bit che a 64-bit ma avevo il mio PATH impostato su librerie a 64-bit. Dopo aver ricompilato la mia domanda (con un certo numero di modifiche nel mio codice) ho avuto questo temuto errore e ho faticato per due giorni. Infine, dopo aver provato una serie di altre cose, ho modificato il mio PATH per 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.

3

ho sperimentato lo stesso problema lo sviluppo di un'applicazione client-server utilizzando Microsoft Visual Studio 2012.

Se è stato utilizzato Visual Studio per sviluppare l'applicazione , è necessario assicurarsi che il nuovo (ovvero il computer su cui il software non è stato sviluppato) disponga del pacchetto ridistribuibile Microsoft Visual C++ appropriato. Se necessario, è necessaria la versione dell'anno e del bit corretta (ad esempio x86 per 32 bit e x64 per 64 bit) del pacchetto ridistribuibile di Visual C++.

The Visual C++ Redistributable Packages install run-time components that are required to run C++ applications built using Visual Studio.

Questo è un collegamento allo Visual C++ Redistributable for Visual Studio 2015.

È possibile verificare quali versioni sono installate accedendo a Pannello di controllo -> Programmi -> Programmi e funzionalità.

Ecco come ho ottenuto questo errore e riparato:

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

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

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

4) Il ComputerB, ho guardato i Programmi e funzionalità e non vedere Visual C++ 2012 Redistributable (x64).

5) In data ComputerB, Ho cercato su google per Visual C++ 2012 Redistributable e selezionare e installare la versione x64.

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

6

Nelle risposte precedenti è stato menzionato che l'utilizzo del Dipendente Walker è la strada da percorrere, nel mio caso (la mia applicazione continua a non funzionare con il codice di errore), il walker delle dipendenze ha mostrato alcune dll che NON sono rilevanti!

finalmente capito che posso correre profilazione andando al menu "profilo" e sarà eseguire l'applicazione e fermarsi al dll esatto che di causare il problema! Ho scoperto che una DLL a 32 bit è stata selezionata a causa del percorso e l'ho riparata.

enter image description here

2

Nel mio caso l'errore si è verificato quando ho rinominato una DLL dopo la costruzione (usando Visual Studio 2015), in modo che si adatti il ​​nome atteso da un eseguibile, che dipendeva dal DLL. Dopo la ridenominazione, l'elenco dei simboli esportati visualizzati da Dependency Walker era vuoto e veniva visualizzato il messaggio di errore "L'applicazione non è stata in grado di avviare correttamente".

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

1

Mi sono appena imbattuto in questo problema. Ho cercato "C++" nelle mie "App & Funzioni" nel pannello di controllo di Windows 10 e ho notato che qualche tipo di aggiornamento era appena stato eseguito alcuni giorni prima e installato VC++ Redistributable 2012-2017. L'app in esecuzione nel messaggio di errore richiedeva solo VC++ 2010. Ho disinstallato tutti e 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 evitare che in modo esplicito, aggiungere questa direttiva preprocessore Stdafx.h (naturalmente, nel mio esempio la risorsa è problematico Controlli comuni di Windows DLL

#if defined(_WIN64) 
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df'\"") 
#endif 
+0

I controlli comuni fanno parte del sistema operativo. Il sistema operativo sa, dove caricare la versione corretta da. Questo non fa nulla per risolvere il problema dell'OP. 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 quello che c'è da fare. – IInspectable