Не вдалося запустити програму (0xc000007b)


159

У мене є програма клієнт / сервер, яку я розробляв на одному ПК. Зараз йому потрібні два послідовних порти, тому я позичив ПК у друга.

Коли я будую додаток і намагаюся запустити або налагодити його (чи то в Delphi IDE, чи в Менеджері файлів Windows), він помиляється "Програму не вдалося запустити правильно (0xc000007b)".

У Google не дуже багато, але, схоже, вказує на те, що Delphi не є специфічним і трапляється з іншими програмами. Це, мабуть, викликано входом у 32-бітну DLL з 64-бітної програми або навпаки.

  • обидва ПК - це Windows 7, 64 біт
  • обидва мають стартерне видання Delphi Xe2, яке може працювати лише з 32 бітами
  • Додаток працює на моєму ПК, але не на моєму другові
  • Інші програми Delphi працюють на будь-якому ПК

Хтось може дати мені підказку, як це відстежувати?


6
З іншого боку, ви можете використовувати com0com для встановлення віртуальних послідовних портів на одному ПК. Відмінно підходить для налагодження та тестування, просто створіть 2 віртуальних порту та з'єднайте їх разом у конфігурації, а потім запускайте свої програми на кожному порту, щоб вони могли спілкуватися один з одним.
Ремі Лебо

1
Ви перевіряли Журнал подій Windows? Іноді Windows надає додаткову інформацію про те, які DLL змусили додаток.
Луїс Карраско

1
Підозрюю, це буде відсутня DLL, зазвичай якась утиліта чи навіть менеджер пам'яті.
mj2008

4
@ mj2008 Відсутня DLL видає іншу помилку: програма не може запуститися, оскільки на вашому комп’ютері відсутня XXXX.dll. Спробуйте перевстановити програму, щоб усунути цю проблему.
Девід Геффернан

3
@snd Ця помилка є STATUS_INVALID_IMAGE_FORMAT. Ви цього не отримуєте, коли система не може знайти DLL цього імені. Ви отримуєте, STATUS_INVALID_IMAGE_FORMATколи DLL можна знайти, але вона пошкоджена або має неправильний біт.
Девід Геффернан

Відповіді:


133

Для початку я б запропонував перевірити, чи є проблема між вашою програмою та її залежностями за допомогою вигулювача залежностей


31
на основі кодів помилок Windows ( google.de/… ), цей код помилки означає: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
mox

95
Це добре свідчить про те, що 32-розрядний додаток намагався завантажити 64-бітну DLL.
Ремі Лебо

4
Насправді, цей Pdf-файл із кодом помилки є чудовим джерелом.
mox

4
+1 і відмітка. Дякую, залежність ходок врятував день. Я замінив 64-бітну DLL на 32-бітну версію, і вона працює зараз.
Мауг каже, що повернемо Моніку

6
Переконайтесь, що ви отримали правильну версію Dependency Walker. Залежність x86 відображатиме неправильні результати для бінарних файлів x64.
Андреас Хафербург

53

Залежність часу від завантаження не вдалося вирішити. Найпростіший спосіб налагодити це - це використовувати Walker Dependency . Використовуйте опцію «Профіль», щоб отримати діагностичний результат процесу завантаження. Це визначить точку невдачі і повинно направити вас на рішення.

Найпоширенішою причиною цієї помилки є спроба завантажити 64-бітну DLL в 32-бітний процес, або навпаки.


2
+1. Також зауважте, що вам слід запустити 32-бітну версію залежника залежностей і переконатися, що всі завантажені DLL-файли 32-бітні. Якщо ви спробуєте запустити 64-бітну версію залежності ходу версії, вона з радістю завантажить 64-бітні DLL-файли, такі як VCRedist, навіть якщо у вас також є їх 32-бітні версії.
liorda

12

Це відсутній dll. Можливо, ваш dll, який працює з компортами, має невирішену залежність dll. Ви можете використовувати ходунок залежності та налагоджувач Windows. Наприклад, перевірте всю бібліотеку mfc. Також ви можете використовувати nrCommlib - це чудові компоненти для роботи з компортами.


12

Я спробував усі зазначені тут речі і знайшов ще одну відповідь. Мені довелося складати свою програму з 32-розрядних DLL-файлів. Я створив бібліотеки як в 32-розрядної, так і в 64-бітній версії, але PATHвстановив 64-бітні бібліотеки. Після того як я перекомпілював свою заявку (з рядом змін у своєму коді), я отримав цю жахливу помилку і боровся два дні. Нарешті, спробувавши ряд інших речей, я змінив свої PATH32-бітні DLL-файли до 64-бітних DLL-файлів (вони мають однакові назви). І це спрацювало. Я просто додаю його тут для повноти.


9

У попередніх відповідях вже згадувалося, що використання ходунка залежностей - це шлях, у моєму випадку (моя програма не вдається з кодом помилки), ходунок залежності показав кілька dll, які НЕ актуальні!

Нарешті з’ясував, що я можу запустити профілювання, перейшовши в меню «профіль», і він запустить додаток і зупиниться на точному dll, що викликає проблему! Я дізнався, що 32-бітний dll був вибраний через шлях і виправив його.

введіть тут опис зображення


5

Нещодавно у мене виникла проблема, коли я розробляв додаток (в якому використовувався послідовний порт), і він працював на всіх машинах, на яких я тестував, але деякі люди отримували цю помилку.

Виявляється, всі машини, на яких сталася помилка, працювали під Win7 x64 і НІКОЛИ НЕ ОНОВЛЮвались.

Запуск оновлення Windows виправляв усі машини в моєму конкретному випадку.


5

У мене виникла та сама проблема, коли розроблявся додаток клієнт-сервер за допомогою Microsoft Visual Studio 2012.

Якщо ви використовували Visual Studio для розробки програми, ви повинні переконатися, що новий (тобто комп'ютер, на якому не було розроблено програмне забезпечення), має відповідний пакет перерозподілу Microsoft Visual C ++. Відповідно, вам потрібна версія для року та біт (тобто x86 для 32-бітової та x64 для 64-бітової) пакету перерозподілу Visual C ++.

Пакети перерозподілюваного пакета Visual C ++ встановлюють компоненти часу виконання, необхідні для запуску програм C ++, побудованих за допомогою Visual Studio.

Ось посилання на перерозподілений Visual C ++ для Visual Studio 2015 .

Ви можете перевірити, які версії встановлені, перейшовши на Панель управління -> Програми -> Програми та функції.

Ось як я отримав цю помилку та виправив її:

1) Я розробив 32-бітну програму за допомогою Visual Studio 2012 на своєму комп’ютері. Давайте подзвонимо на мій комп'ютер ComputerA.

2) Я встановив .exe та пов'язані з ним файли на іншому комп'ютері, який ми будемо називати ComputerB.

3) На ComputerB я запустив .exe і отримав повідомлення про помилку.

4) На ComputerB я переглянув Програми та функції та не побачив перерозподілення Visual C ++ 2012 (x64).

5) На ComputerB я переглянув Google для перерозподілу Visual C ++ 2012 і вибрав та встановив версію x64.

6) На ComputerB я запустив .exe на ComputerB і не отримав повідомлення про помилку.


3

Насправді ця помилка вказує на недійсний формат зображення. Однак чому це відбувається і що зазвичай означає код помилки? Насправді це може з'явитися, коли ви намагаєтеся запустити програму, яка створена для або призначена для роботи з 64-бітовою операційною системою Windows, але ваш комп'ютер працює на 32-бітній операційній системі.

Можливі причини:

  • Microsoft Visual C ++
  • Потрібно перезапустити
  • DirectX
  • .NET Framework
  • Потрібно перевстановити
  • Потрібно запустити додаток як адміністратор

Джерело: http://www.solveinweb.com/solved-the-application-was-unable-to-start-correct-0xc000007b-click-ok-to-close-the-application/


2

Це може бути випадок, коли налагодження налагоджувача може бути корисним. По суті, якщо ви дотримуєтесь інструкцій тут, ви можете запустити дві ідеї, і одна буде налагоджуватись в іншій. Якщо ви скасуєте свою заявку в одній, іноді ви можете виявити помилки, які ви інакше пропускаєте. Варто спробувати.


2
Це майже напевно помилка, про яку повідомляє завантажувач, і тому виникає перед початком процесу. Отже, налагодження не буде варіантом. Звичайно, я можу помилитися в своєму діагнозі, що помилка піднімається навантажувачем.
Девід Геффернан

2

Я бачив помилку при спробі запустити VC ++ налагоджувану програму на машині, на якій не встановлено Visual C ++. Створення версії випуску та використання її виправленої.


2

У моєму випадку помилка сталася, коли я перейменував DLL після його створення (використовуючи Visual Studio 2015), так що він відповідає імені, очікуваному виконуваним файлом, який залежав від DLL. Після перейменування список експортованих символів, відображених у Dekepender Walker, був порожнім, і з'явилося згадане повідомлення про помилку "Програму не вдалося запустити правильно".

Таким чином, це можна було б виправити, змінивши ім'я вихідного файлу в параметрах лінкера Visual Studio.


2

Ви можете мати це, якщо ви намагаєтесь виявити у вашій програмі залежність від Microsoft.Windows.Common-Controls . Це робиться, коли ви хочете завантажити версію 6 загальної бібліотеки керування, щоб візуальні стилі застосовувалися до загальних елементів управління.

Ви, ймовірно, дотримувались оригінальної документації Microsoft ще з днів Windows XP та додали до маніфесту програми:

<!-- 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 - це вже не ОС, і ви вже не 32-бітове додаток. За останні 17 років Microsoft оновила свою документацію ; тепер вам час оновити свій маніфест:

<!-- 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>

У Реймонда Чена є прекрасна історія загального контролю:


3
"Windows XP - це вже не ОС", який зробив мій день: D
Вікторія,

Але я поставив це питання ще в 12 році - чи тоді додатки Windows навіть мали маніфести?
Мауг каже, що повернути Моніку

1
@Mawg Це може бути пов'язано з вашою проблемою. Але коли Stackoverflow є поєднанням wiki та reddit для знань; корисно знати, яка точна помилка ви повідомили. Сказавши це, програми Windows мали маніфести збірки, що повертаються до Windows 2000; і починаючи з Windows XP, ви більше не отримаєте останню версію comctl32.dll, якщо ваш маніфест збірки не оголосив про залежність від неї.
Ян Бойд

1

Щойно вирішив цю проблему для мого особистого проекту (за це дякую Дрісу). Для мене це було тому, що шлях проекту був занадто довгим. Після збереження .sln на коротший шлях (C: / MyProjects) та компіляції звідти він пройшов без помилки.


1
@jojodmo: насправді, "для мене це було тому, що шлях проекту був занадто довгим", мені здається, є вагомим внеском у полювання на помилок ...
Крістіан Северин

1

Також завантажте та розпакуйте "Залежності" в ту саму папку, куди ви поклали wget.exe

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

Потім у вас буде кілька файлів lib * .dll, а також wget.exe в тій же папці, і це повинно працювати нормально.

(Я також відповів тут https://superuser.com/a/873531/146668, який я спочатку знайшов.)


1

Я щойно стикався з цим питанням. Я шукав "C ++" у розділі "Додатки та функції" на панелі керування Windows 10 і помітив, що якесь оновлення було запущене за кілька днів до цього та встановлено VC ++ Перерозподільний 2012-2017 роки. Додаток, який працював у повідомленні про помилку, вимагав лише VC ++ 2010. Я видалив їх усіх, а потім перевстановив лише 2010 x86 / x64, і помилка зникла, і програма функціонувала, як очікувалося.


1

Це може статися, якщо з якоїсь причини ресурс x86 завантажується з машини x64. Щоб уникнути цього прямо, додайте цю директиву препроцесора до stdafx.h (звичайно, на моєму прикладі проблемним ресурсом є 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

1
Загальні елементи управління є частиною операційної системи. Операційна система знає, звідки слід завантажити правильну версію. Це нічого не робить для вирішення питання ОП. Він навіть не встановлює залежність. Все, що він робить, - це зібрати маніфестний ресурс у додаток для використання версії 6 загальних елементів управління. Препроцесор умовний також не потрібен. Просто встановити processorArchitecture='*', і це все, що там є.
Неочікуваний

1

Можливо, у вас є кілька версій dll (s) у вашій системі. Ви можете шукати вашу систему, щоб дізнатися це. Проблему можна вирішити, просто змінивши порядок каталогів на вашому шляху. Це було моє питання. ( Неможливо запустити графічний інтерфейс Qt Creator за межами Qt. "Програма не змогла запуститись коректно (0xc000007b)" помилка )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.