Die Anwendung konnte nicht korrekt gestartet werden (0xc000007b)

159

Ich habe eine Client / Server-App, die ich auf einem einzelnen PC entwickelt habe. Jetzt braucht es zwei serielle Schnittstellen, also habe ich mir einen PC von einem Freund ausgeliehen.

Wenn ich meine App erstelle und versuche, sie auszuführen oder zu debuggen (ob in der Delphi-IDE oder im Windows-Dateimanager), wird der Fehler "Die Anwendung konnte nicht korrekt gestartet (0xc000007b)" angezeigt.

Googeln bringt nicht viel hervor, scheint aber darauf hinzudeuten, dass dies nichts Delphi-spezifisches ist und mit anderen Apps passiert. Dies scheint durch den Aufruf einer 32-Bit-DLL aus einer 64-Bit-App oder umgekehrt verursacht zu werden.

  • Beide PCs sind Windows 7, 64 Bit
  • Beide haben die Delphi Xe2 Starter Edition, die nur 32 Bit verarbeiten kann
  • Die App läuft gut auf meinem PC, aber nicht auf dem meines Freundes
  • Andere Delphi-Apps laufen auf beiden PCs einwandfrei

Kann mir jemand einen Hinweis geben, wie ich das aufspüren kann?

Mawg sagt, Monica wieder einzusetzen
quelle
6
Nebenbei bemerkt, Sie können com0com verwenden , um virtuelle serielle Ports auf einem einzelnen PC zu installieren. Hervorragend zum Debuggen und Testen geeignet. Erstellen Sie einfach zwei virtuelle Ports und verknüpfen Sie sie in der Konfiguration miteinander. Führen Sie dann Ihre Apps auf jedem Port aus, damit sie miteinander kommunizieren können.
Remy Lebeau
1
Haben Sie das Windows-Ereignisprotokoll überprüft? Manchmal bietet Windows weitere Informationen darüber, durch welche DLL die App fehlgeschlagen ist.
Luis Carrasco
1
Ich vermute, es wird eine fehlende DLL sein, normalerweise ein Dienstprogramm oder sogar der Speichermanager.
mj2008
4
@ mj2008 Fehlende DLL führt zu einem anderen Fehler: Das Programm kann nicht gestartet werden, da XXXX.dll auf Ihrem Computer fehlt. Versuchen Sie, das Programm neu zu installieren, um dieses Problem zu beheben.
David Heffernan
3
@snd Dieser Fehler ist STATUS_INVALID_IMAGE_FORMAT. Sie erhalten das nicht, wenn das System keine DLL dieses Namens finden kann. Sie erhalten, STATUS_INVALID_IMAGE_FORMATwenn eine DLL gefunden werden kann, diese jedoch beschädigt ist oder die falsche Bitigkeit aufweist.
David Heffernan

Antworten:

133

Zu Beginn würde ich vorschlagen, mit dem Dependency Walker zu testen, ob zwischen Ihrer Anwendung und ihren Abhängigkeiten ein Problem besteht

Mox
quelle
31
Basierend auf den Windows-Fehlercodes ( google.de/… ) bedeutet dieser Fehlercode: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
Mox
95
Dies ist ein guter Hinweis darauf, dass die 32-Bit-App versucht hat, eine 64-Bit-DLL zu laden.
Remy Lebeau
4
In der Tat ist diese Fehlercode-PDF-Datei eine ausgezeichnete Quelle.
Mox
4
+1 und die Antwort. Danke, Abhängigkeitsläufer hat den Tag gerettet. Ich habe eine 64-Bit-DLL durch eine 32-Bit-Version ersetzt und sie funktioniert jetzt.
Mawg sagt, Monica
6
Stellen Sie sicher, dass Sie die richtige Version von Dependency Walker haben. Die x86-Abhängigkeiten zeigen falsche Ergebnisse für x64-Binärdateien an.
Andreas Haferburg
53

Eine Ladezeitabhängigkeit konnte nicht aufgelöst werden. Der einfachste Weg, dies zu debuggen, ist die Verwendung von Dependency Walker . Verwenden Sie die Option Profil, um eine Diagnoseausgabe des Ladevorgangs abzurufen. Dies identifiziert den Fehlerpunkt und sollte Sie zu einer Lösung führen.

Die häufigste Ursache für diesen Fehler ist der Versuch, eine 64-Bit-DLL in einen 32-Bit-Prozess zu laden oder umgekehrt.

David Heffernan
quelle
2
+1. Beachten Sie außerdem, dass Sie die 32-Bit-Version von Dependency Walker ausführen und sicherstellen sollten, dass alle geladenen DLLs 32-Bit sind. Wenn Sie versuchen, den Abhängigkeits-Walker für 64-Bit-Versionen auszuführen, werden die 64-Bit-DLLs wie VCRedist problemlos geladen, auch wenn Sie auch über 32-Bit-Versionen verfügen.
Liorda
12

Es ist eine fehlende DLL. Möglicherweise hat Ihre DLL, die mit COM-Ports funktioniert, eine ungelöste DLL-Abhängigkeit. Sie können den Abhängigkeits-Walker und den Windows-Debugger verwenden. Überprüfen Sie zum Beispiel die gesamte MFC-Bibliothek. Sie können auch nrCommlib verwenden - es sind großartige Komponenten, um mit COM-Ports zu arbeiten.

Alex.kononov
quelle
12

Ich habe alle hier angegebenen Dinge ausprobiert und eine weitere Antwort gefunden. Ich musste meine Anwendung mit 32-Bit-DLLs kompilieren. Ich hatte die Bibliotheken sowohl in 32-Bit- als auch in 64-Bit-Versionen erstellt, aber PATHauf 64-Bit-Bibliotheken eingestellt. Nachdem ich meine Anwendung neu kompiliert hatte (mit einer Reihe von Änderungen in meinem Code), bekam ich diesen gefürchteten Fehler und kämpfte zwei Tage lang. Nachdem ich einige andere Dinge ausprobiert hatte, änderte ich meine PATH32-Bit-DLLs vor den 64-Bit-DLLs (sie haben den gleichen Namen). Und es hat funktioniert. Der Vollständigkeit halber füge ich es hier hinzu.

unxnut
quelle
9

In früheren Antworten wurde erwähnt, dass die Verwendung von Dependency Walker der richtige Weg ist. In meinem Fall (meine Anwendung schlägt immer wieder mit dem Fehlercode fehl) zeigte Dependency Walker einige DLLs, die NICHT relevant sind!

Schließlich habe ich herausgefunden, dass ich die Profilerstellung ausführen kann, indem ich zum Menü "Profil" gehe. Dadurch wird die Anwendung ausgeführt und bei der genauen DLL angehalten, die das Problem verursacht! Ich fand heraus, dass eine 32-Bit-DLL aufgrund des Pfads ausgewählt und repariert wurde.

Geben Sie hier die Bildbeschreibung ein

pktCoder
quelle
5

Ich hatte kürzlich ein Problem, bei dem ich eine Anwendung entwickelte (die eine serielle Schnittstelle verwendete), die auf allen Computern funktionierte, auf denen ich sie getestet habe, aber einige Leute haben diesen Fehler erhalten.

Es stellte sich heraus, dass auf allen Computern, auf denen der Fehler aufgetreten ist, Win7 x64 ausgeführt wurde und NIE EINMAL aktualisiert wurde.

Durch Ausführen eines Windows-Updates wurden alle Computer in meinem speziellen Fall behoben.

mitchfish36
quelle
5

Ich hatte das gleiche Problem beim Entwickeln einer Client-Server-App mit Microsoft Visual Studio 2012.

Wenn Sie die App mit Visual Studio entwickelt haben, müssen Sie sicherstellen, dass auf dem neuen (dh dem Computer, auf dem die Software nicht entwickelt wurde) das entsprechende Microsoft Visual C ++ Redistributable Package vorhanden ist. Gegebenenfalls benötigen Sie die richtige Jahres- und Bitversion (dh x86 für 32 Bit und x64 für 64 Bit) des Visual C ++ Redistributable Package.

Die Visual C ++ Redistributable Packages installieren Laufzeitkomponenten, die zum Ausführen von C ++ - Anwendungen erforderlich sind, die mit Visual Studio erstellt wurden.

Hier ist ein Link zu Visual C ++ Redistributable für Visual Studio 2015 .

Sie können überprüfen, welche Versionen installiert sind, indem Sie auf Systemsteuerung -> Programme -> Programme und Funktionen klicken.

So habe ich diesen Fehler erhalten und behoben:

1) Ich habe mit Visual Studio 2012 eine 32-Bit-Anwendung auf meinem Computer entwickelt. Nennen wir meinen Computer ComputerA.

2) Ich habe die EXE-Datei und die zugehörigen Dateien auf einem anderen Computer installiert, den wir ComputerB nennen.

3) Auf ComputerB habe ich die EXE-Datei ausgeführt und die Fehlermeldung erhalten.

4) Auf Computer B habe ich mir die Programme und Funktionen angesehen und Visual C ++ 2012 Redistributable (x64) nicht gesehen.

5) Auf ComputerB habe ich nach Visual C ++ 2012 Redistributable gegoogelt und die x64-Version ausgewählt und installiert.

6) Auf ComputerB habe ich die EXE-Datei auf ComputerB ausgeführt und keine Fehlermeldung erhalten.

user3731622
quelle
3

Tatsächlich weist dieser Fehler auf ein ungültiges Bildformat hin. Warum geschieht dies jedoch und was bedeutet der Fehlercode normalerweise? Dies kann tatsächlich auftreten, wenn Sie versuchen, ein Programm auszuführen, das für ein 64-Bit-Windows-Betriebssystem entwickelt wurde oder mit diesem arbeiten soll, Ihr Computer jedoch unter einem 32-Bit-Betriebssystem ausgeführt wird.

Mögliche Gründe:

  • Microsoft Visual C ++
  • Müssen neu starten
  • DirectX
  • .NET Framework
  • Neuinstallation erforderlich
  • Sie müssen die Anwendung als Administrator ausführen

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

Löse 101
quelle
2

Dies kann ein Fall sein, in dem das Debuggen des Debuggers hilfreich sein kann. Wenn Sie den Anweisungen hier folgen , können Sie im Wesentlichen zwei Ideen ausführen, und eine debuggt in die andere. Wenn Sie Ihre Anwendung in einer aufheben, können Sie manchmal Fehler abfangen, die Sie sonst übersehen. Es ist einen Versuch wert.

Toby Allen
quelle
2
Dies ist mit ziemlicher Sicherheit ein vom Lader gemeldeter Fehler, der vor dem Start des Prozesses auftritt. Daher wäre das Debuggen keine Option. Natürlich kann ich mich in meiner Diagnose irren, dass der Fehler vom Lader ausgelöst wird.
David Heffernan
2

Ich habe den Fehler beim Versuch gesehen, die ausführbare VC ++ - Debug-Datei auf einem Computer auszuführen, auf dem Visual C ++ nicht installiert war. Das Erstellen einer Release-Version und deren Verwendung haben das Problem behoben.

Bill Greer
quelle
2

In meinem Fall trat der Fehler auf, als ich eine DLL nach dem Erstellen (mit Visual Studio 2015) umbenannte, sodass sie dem Namen entspricht, der von einer ausführbaren Datei erwartet wird, die von der DLL abhängt. Nach dem Umbenennen war die Liste der exportierten Symbole, die von Dependency Walker angezeigt wurden, leer und die Fehlermeldung "Die Anwendung konnte nicht korrekt gestartet werden" wurde angezeigt.

Es kann also behoben werden, indem der Name der Ausgabedatei in den Visual Studio-Linkeroptionen geändert wird.

Nukleon
quelle
2

Sie können dies haben, wenn Sie versuchen, Ihrer Anwendung zu zeigen, dass sie von der Microsoft.Windows.Common-Controls- Assembly abhängt . Sie tun dies, wenn Sie Version 6 der Bibliothek für allgemeine Steuerelemente laden möchten, damit visuelle Stile auf allgemeine Steuerelemente angewendet werden.

Sie haben wahrscheinlich die ursprüngliche Dokumentation von Microsoft aus Windows XP-Tagen befolgt und dem Manifest Ihrer Anwendung Folgendes hinzugefügt:

<!-- 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 ist nicht mehr das Betriebssystem und Sie sind keine 32-Bit-Anwendung mehr. In den letzten 17 Jahren hat Microsoft die Dokumentation aktualisiert . Jetzt ist es Zeit für Sie, Ihr Manifest zu aktualisieren:

<!-- 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 hat eine schöne Geschichte der Common Controls:

Ian Boyd
quelle
3
"Windows XP ist nicht mehr das Betriebssystem" machte meinen Tag: D
Victoria
Aber ich habe diese Frage bereits 12 gestellt - hatten Windows-Apps damals überhaupt Manifeste?
Mawg sagt, Monica am
1
@Mawg Dies kann mit Ihrem Problem zusammenhängen oder nicht. Aber mit Stackoverflow als Kombination aus Wiki und Reddit für Wissen; Es ist ein guter Leckerbissen, den genauen Fehler zu kennen, den Sie gemeldet haben. Allerdings haben Windows-Apps Assembly-Manifeste, die auf Windows 2000 zurückgehen. Ab Windows XP erhalten Sie nicht mehr die neueste Version von comctl32.dll, es sei denn, Ihr Assemblymanifest hat eine Abhängigkeit davon deklariert.
Ian Boyd
1

Habe gerade dieses Problem für mein persönliches Projekt gelöst (danke an Dries dafür). Für mich war es, weil der Projektweg zu lang war. Nachdem die .sln auf einem kürzeren Pfad (C: / MyProjects) gespeichert und von dort kompiliert wurde, lief sie ohne Fehler.

user1539405
quelle
1
@jojodmo: Eigentlich scheint "Für mich war es, weil der Projektpfad zu lang war" ein gültiger Beitrag zur Fehlersuche zu sein ...
Christian Severin
1

Laden Sie auch "Abhängigkeiten" herunter und entpacken Sie sie in denselben Ordner, aus dem Sie die Datei wget.exe ablegen

http://gnuwin32.sourceforge.net/packages/wget.htm

Sie haben dann einige lib * .dll-Dateien sowie wget.exe im selben Ordner und es sollte gut funktionieren.

(Ich habe auch hier https://superuser.com/a/873531/146668 geantwortet, was ich ursprünglich gefunden habe.)

Andreas Reiff
quelle
1

Ich bin gerade auf dieses Problem gestoßen. Ich suchte unter "Apps & Features" in der Windows 10-Systemsteuerung nach "C ++" und stellte fest, dass erst einige Tage zuvor ein Update ausgeführt und VC ++ Redistributable 2012-2017 installiert wurde. Die App, auf der die Fehlermeldung ausgeführt wurde, erforderte nur VC ++ 2010. Ich habe alle deinstalliert und dann nur 2010 x86 / x64 neu installiert. Der Fehler wurde behoben und die Anwendung funktionierte wie erwartet.

Chris Putnam
quelle
1

Dies kann passieren, wenn aus irgendeinem Grund eine x86-Ressource von einem x64-Computer geladen wird. Um dies explizit zu vermeiden, fügen Sie diese Präprozessor-Direktive zu stdafx.h hinzu (in meinem Beispiel ist die problematische Ressource natürlich die Windows Common Controls-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
Michael Haephrati
quelle
1
Die allgemeinen Steuerelemente sind Teil des Betriebssystems. Das Betriebssystem weiß, woher die richtige Version geladen werden muss. Dies löst das Problem des OP nicht. Es wird nicht einmal eine Abhängigkeit installiert. Es wird lediglich eine Manifestressource in die Anwendung kompiliert, um Version 6 der allgemeinen Steuerelemente zu verwenden. Die Präprozessorbedingung wird ebenfalls nicht benötigt. Einfach einstellen processorArchitecture='*', und das ist alles.
Unsichtbarer