Aplikacja nie mogła się poprawnie uruchomić (0xc000007b)

159

Mam aplikację typu klient / serwer, którą tworzyłem na jednym komputerze. Teraz potrzebuje dwóch portów szeregowych, więc pożyczyłem komputer od znajomego.

Kiedy buduję swoją aplikację i próbuję ją uruchomić lub debugować (czy to w środowisku Delphi IDE, czy w menedżerze plików Windows), wyświetla się komunikat „Aplikacja nie mogła się poprawnie uruchomić (0xc000007b)”.

Googlowanie nie przynosi zbyt wiele, ale wydaje się wskazywać, że nie jest to nic specyficznego dla Delphi i dzieje się z innymi aplikacjami. Wydaje się, że jest to spowodowane wywołaniem 32-bitowej biblioteki DLL z aplikacji 64-bitowej lub odwrotnie.

  • oba komputery mają 64-bitowy system Windows 7
  • oba mają startową edycję Delphi Xe2, która obsługuje tylko 32 bity
  • Aplikacja działa dobrze na moim komputerze, ale nie na moim znajomym
  • Inne aplikacje Delphi działają dobrze na obu komputerach

Czy ktoś może mi podpowiedzieć, jak to wyśledzić?

Mawg mówi, że przywróć Monikę
źródło
6
Na marginesie, możesz użyć com0com do zainstalowania wirtualnych portów szeregowych na jednym komputerze. Świetnie nadaje się do debugowania i testowania, wystarczy utworzyć 2 porty wirtualne i połączyć je w konfiguracji, a następnie uruchomić aplikacje na każdym porcie, aby mogły ze sobą rozmawiać.
Remy Lebeau
1
Czy sprawdziłeś dziennik zdarzeń systemu Windows? Czasami system Windows udostępnia więcej informacji o tym, która biblioteka DLL spowodowała awarię aplikacji.
Luis Carrasco
1
Podejrzewam, że będzie to brakująca biblioteka DLL, zwykle jakieś narzędzie lub nawet menedżer pamięci.
mj2008
4
@ mj2008 Brak biblioteki DLL powoduje inny błąd: Nie można uruchomić programu, ponieważ na komputerze brakuje pliku XXXX.dll. Spróbuj ponownie zainstalować program, aby rozwiązać ten problem.
David Heffernan
3
@snd Ten błąd to STATUS_INVALID_IMAGE_FORMAT. Nie otrzymasz tego, gdy system nie może znaleźć biblioteki DLL o tej nazwie. Otrzymujesz, STATUS_INVALID_IMAGE_FORMATgdy można znaleźć bibliotekę DLL, ale jest ona uszkodzona lub ma niewłaściwą bitowość.
David Heffernan,

Odpowiedzi:

133

Na początek proponuję przetestować, czy istnieje problem między twoją aplikacją a jej zależnościami za pomocą narzędzia do przechodzenia zależności

mox
źródło
31
w oparciu o kody błędów systemu Windows ( google.de/… ), ten kod błędu oznacza: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
mox
95
Co dobrze wskazuje, że 32-bitowa aplikacja próbowała załadować 64-bitową bibliotekę DLL.
Remy Lebeau
4
W rzeczywistości ten plik PDF z kodem błędu jest doskonałym źródłem.
mox
4
+1 i odpowiedź. Dzięki, chodzik zależny uratował dzień. Zastąpiłem 64-bitową bibliotekę DLL wersją 32-bitową i teraz działa.
Mawg mówi, że przywróć Monikę
6
Upewnij się, że masz odpowiednią wersję Dependency Walker. Zależności x86 będą wyświetlać nieprawidłowe wyniki dla plików binarnych x64.
Andreas Haferburg
53

Nie można rozwiązać zależności czasu ładowania. Najłatwiejszym sposobem debugowania tego jest użycie Dependency Walker . Użyj opcji Profil, aby uzyskać dane wyjściowe diagnostyki procesu ładowania. Pozwoli to zidentyfikować punkt awarii i poprowadzi Cię do rozwiązania.

Najczęstszą przyczyną tego błędu jest próba załadowania 64-bitowej biblioteki DLL do procesu 32-bitowego lub odwrotnie.

David Heffernan
źródło
2
+1. Należy również pamiętać, że należy uruchomić 32-bitową wersję narzędzia do przechodzenia zależności i upewnić się, że wszystkie załadowane biblioteki DLL są 32-bitowe. Jeśli spróbujesz uruchomić chodzik zależności wersji 64-bitowej, z radością załaduje 64-bitowe biblioteki DLL, takie jak VCRedist, nawet jeśli masz również ich wersje 32-bitowe.
liorda
12

Jest to brakująca biblioteka DLL. Prawdopodobnie twoja biblioteka dll, która współpracuje z portami com, ma nierozwiązaną zależność dll. Możesz użyć walkera zależności i debuggera systemu Windows. Na przykład sprawdź całą bibliotekę mfc. Możesz także użyć nrCommlib - jest to świetne komponenty do pracy z portami komunikacyjnymi.

Alex.kononov
źródło
12

Wypróbowałem wszystkie wymienione tutaj rzeczy i znalazłem inną odpowiedź. Musiałem skompilować moją aplikację z 32-bitowymi bibliotekami DLL. Zbudowałem biblioteki zarówno w wersji 32-bitowej, jak i 64-bitowej, ale miałem PATHustawione biblioteki 64-bitowe. Po ponownym skompilowaniu mojej aplikacji (z pewną liczbą zmian w moim kodzie) otrzymałem ten przerażający błąd i walczyłem przez dwa dni. Wreszcie, po wypróbowaniu wielu innych rzeczy, zmieniłem ustawienia, PATHaby mieć 32-bitowe biblioteki DLL przed 64-bitowymi bibliotekami DLL (mają te same nazwy). I zadziałało. Po prostu dodam go tutaj dla kompletności.

unxnut
źródło
9

Wspomniano już we wcześniejszych odpowiedziach, że użycie walkera zależności jest drogą do zrobienia, w moim przypadku (moja aplikacja ciągle zawodzi z kodem błędu), Dependency Walker pokazał kilka plików DLL, które NIE są istotne!

Wreszcie zorientowałem się, że mogę uruchomić profilowanie, przechodząc do menu "profil", a aplikacja uruchomi się i zatrzyma na dokładnym pliku dll, który jest przyczyną problemu! Dowiedziałem się, że wybrano 32-bitową bibliotekę DLL ze względu na ścieżkę i naprawiłem ją.

wprowadź opis obrazu tutaj

pktCoder
źródło
5

Niedawno miałem problem z tworzeniem aplikacji (która korzystała z portu szeregowego) i działała na wszystkich maszynach, na których ją testowałem, ale kilka osób otrzymywało ten błąd.

Okazuje się, że wszystkie maszyny, na których wystąpił błąd, działały pod systemem Win7 x64 i NIGDY RAZEM nie były aktualizowane.

Uruchomienie aktualizacji systemu Windows naprawiło wszystkie komputery w moim konkretnym przypadku.

mitchfish36
źródło
5

Doświadczyłem tego samego problemu podczas tworzenia aplikacji klient-serwer przy użyciu Microsoft Visual Studio 2012.

Jeśli do tworzenia aplikacji korzystałeś z programu Visual Studio, musisz upewnić się, że nowy (tj. Komputer, na którym oprogramowanie nie zostało opracowane) ma odpowiedni pakiet redystrybucyjny Microsoft Visual C ++. Potrzebujesz odpowiedniego roku i wersji bitowej (np. X86 dla wersji 32-bitowej i x64 dla wersji 64-bitowej) pakietu redystrybucyjnego Visual C ++.

Pakiety redystrybucyjne Visual C ++ instalują składniki czasu wykonywania, które są wymagane do uruchamiania aplikacji C ++ utworzonych przy użyciu programu Visual Studio.

Oto łącze do pakietu redystrybucyjnego Visual C ++ dla programu Visual Studio 2015 .

Możesz sprawdzić, jakie wersje są zainstalowane, przechodząc do Panelu sterowania -> Programy -> Programy i funkcje.

Oto jak otrzymałem ten błąd i naprawiłem go:

1) Stworzyłem aplikację 32-bitową przy użyciu programu Visual Studio 2012 na moim komputerze. Nazwijmy mój komputer ComputerA.

2) Zainstalowałem plik .exe i powiązane pliki na innym komputerze, który nazwiemy ComputerB.

3) Na komputerze B uruchomiłem plik .exe i otrzymałem komunikat o błędzie.

4) Na ComputerB przyjrzałem się programom i funkcjom i nie widziałem pakietu redystrybucyjnego Visual C ++ 2012 (x64).

5) Na komputerze B wyszukałem w Google pakiet redystrybucyjny Visual C ++ 2012, wybrałem i zainstalowałem wersję x64.

6) Na komputerze B uruchomiłem plik .exe na komputerze B i nie otrzymałem komunikatu o błędzie.

user3731622
źródło
3

W rzeczywistości ten błąd wskazuje na nieprawidłowy format obrazu. Jednak dlaczego tak się dzieje i co zwykle oznacza kod błędu? W rzeczywistości może się to pojawić, gdy próbujesz uruchomić program, który jest przeznaczony lub przeznaczony do pracy z 64-bitowym systemem operacyjnym Windows, ale Twój komputer działa w 32-bitowym systemie operacyjnym.

Możliwe przyczyny:

  • Microsoft Visual C ++
  • Musisz ponownie uruchomić
  • DirectX
  • .NET Framework
  • Musisz ponownie zainstalować
  • Musisz uruchomić aplikację jako administrator

Źródło: http://www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/

Rozwiąż 101
źródło
2

Może to być przypadek, w którym debugowanie debugera może być przydatne. Zasadniczo, jeśli postępujesz zgodnie z instrukcjami tutaj , możesz uruchomić dwa idee, a jeden będzie debugować w drugim. Jeśli umieścisz swoją aplikację w jednym, możesz czasami wyłapać błędy, które w innym przypadku byś przeoczył. Warto spróbować.

Toby Allen
źródło
2
Jest to prawie na pewno błąd zgłoszony przez program ładujący i dlatego występuje przed rozpoczęciem procesu. Dlatego debugowanie nie byłoby opcją. Oczywiście mogę się mylić w swojej diagnozie, że błąd podnosi ładowarka.
David Heffernan
2

Widziałem błąd podczas próby uruchomienia pliku wykonywalnego debugowania VC ++ na komputerze, na którym nie zainstalowano programu Visual C ++. Stworzenie wersji wydania i użycie tego naprawiło to.

Bill Greer
źródło
2

W moim przypadku błąd wystąpił, gdy zmieniłem nazwę biblioteki DLL po jej zbudowaniu (przy użyciu programu Visual Studio 2015), tak aby pasowała do nazwy oczekiwanej przez plik wykonywalny, który był zależny od biblioteki DLL. Po zmianie nazwy lista wyeksportowanych symboli wyświetlona przez Dependency Walker była pusta i pojawił się wspomniany komunikat o błędzie „Aplikacja nie mogła się poprawnie uruchomić”.

Więc można to naprawić, zmieniając nazwę pliku wyjściowego w opcjach konsolidatora programu Visual Studio.

nukleon
źródło
2

Możesz to zrobić, jeśli próbujesz zamanifestować swoją aplikację, że jest ona zależna od zestawu Microsoft.Windows.Common-Controls . Robisz to, gdy chcesz załadować wersję 6 wspólnej biblioteki kontrolek - aby style wizualne były stosowane do wspólnych kontrolek.

Prawdopodobnie skorzystałeś z oryginalnej dokumentacji Microsoftu z czasów Windows XP i dodałeś następujące elementy do manifestu swojej aplikacji:

<!-- 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 nie jest już systemem operacyjnym i nie jesteś już aplikacją 32-bitową. W ciągu ostatnich 17 lat Microsoft zaktualizował swoją dokumentację ; teraz nadszedł czas, aby zaktualizować swój 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 ma cudowną historię wspólnych elementów sterujących:

Ian Boyd
źródło
3
„Windows XP nie jest już systemem operacyjnym” zrobił mój dzień: D
Victoria
Ale zadałem to pytanie w '12 - czy aplikacje Windows miały wtedy w ogóle manifesty?
Mawg mówi, że przywróć Monikę
1
@Mawg To może być związane z Twoim problemem lub nie. Ale z Stackoverflow będącym połączeniem wiki i reddit dla wiedzy; dobrze jest wiedzieć, jaki dokładnie błąd zgłosiłeś. To powiedziawszy, aplikacje Windows miały manifesty montażowe sięgające do Windows 2000; a zaczynając od systemu Windows XP, nie można już uzyskać najnowszej wersji pliku comctl32.dll, chyba że manifest zestawu zadeklarował zależność od niego.
Ian Boyd
1

Właśnie rozwiązałem ten problem dla mojego osobistego projektu (dzięki za to Driesowi). Dla mnie to dlatego, że ścieżka projektu była zbyt długa. Po zapisaniu .sln w krótszej ścieżce (C: / MyProjects) i skompilowaniu stamtąd działał bez błędu.

user1539405
źródło
1
@jojodmo: właściwie, "Dla mnie to było dlatego, że ścieżka projektu była zbyt długa" wydaje mi się być ważnym wkładem w poszukiwanie błędów ...
Christian Severin
1

Właśnie natknąłem się na ten problem. Szukałem „C ++” w moim „Aplikacje i funkcje” w panelu sterowania Windows 10 i zauważyłem, że jakiś rodzaj aktualizacji został uruchomiony kilka dni wcześniej i zainstalowałem pakiet redystrybucyjny VC ++ 2012-2017. Aplikacja, która wyświetlała komunikat o błędzie, wymagała tylko VC ++ 2010. Odinstalowałem je wszystkie, a następnie ponownie zainstalowałem tylko 2010 x86 / x64 i błąd zniknął, a aplikacja działała zgodnie z oczekiwaniami.

Chris Putnam
źródło
1

Może się tak zdarzyć, jeśli z jakiegoś powodu zasób x86 jest ładowany z maszyny x64. Aby tego uniknąć, dodaj tę dyrektywę preprocesora do stdafx.h (oczywiście w moim przykładzie problematycznym zasobem jest biblioteka DLL Windows Common Controls.

#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
źródło
1
Wspólne elementy sterujące są częścią systemu operacyjnego. System operacyjny wie, skąd pobrać poprawną wersję. Nie rozwiązuje to problemu PO. Nie instaluje nawet zależności. Wszystko, co robi, to kompilowanie zasobu manifestu w aplikacji, aby używać wersji 6 wspólnych formantów. Preprocesor warunkowy również nie jest potrzebny. Po prostu ustaw processorArchitecture='*'i to wszystko.
Niespodziewane