Приложение не удалось правильно запустить (0xc000007b)

159

У меня есть клиент / серверное приложение, которое я разрабатывал на одном ПК. Теперь ему нужны два последовательных порта, поэтому я позаимствовал компьютер у друга.

Когда я создаю свое приложение и пытаюсь запустить или отладить его (в Delphi IDE или из диспетчера файлов Windows), оно выдает сообщение об ошибке «Не удалось правильно запустить приложение (0xc000007b)».

Поиск в Google не вызывает особого интереса, но, похоже, указывает на то, что в Delphi нет ничего особенного и происходит с другими приложениями. Кажется, это вызвано вызовом 32-битной DLL из 64-битного приложения или наоборот.

  • оба компьютера работают под управлением Windows 7, 64 бит
  • оба имеют начальную версию Delphi Xe2, которая может обрабатывать только 32 бита
  • Приложение отлично работает на моем компьютере, но не на моем друге
  • Другие приложения Delphi отлично работают на обоих ПК

Кто-нибудь может дать мне подсказку, как это отследить?

Mawg говорит восстановить Монику
источник
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

Для начала я бы предложил проверить, есть ли проблема между вашим приложением и его зависимостями, используя средство обхода зависимостей.

MOX
источник
31
на основе кодов ошибок Windows ( google.de/… ) этот код ошибки означает: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
Мокс
95
Что является хорошим показателем того, что 32-битное приложение пыталось загрузить 64-битную DLL.
Реми Лебо
4
На самом деле, этот PDF-файл с кодом ошибки является отличным источником.
Мокс
4
+1 и ответ. Спасибо, иждивенец спас дня. Я заменил 64-битную DLL на 32-битную версию, и теперь она работает.
Mawg говорит восстановить Monica
6
Убедитесь, что вы получили правильную версию Dependency Walker. В зависимости от x86 будут отображаться неверные результаты для двоичных файлов x64.
Андреас Хефербург
53

Зависимость времени загрузки не может быть разрешена. Самый простой способ отладки - использовать Dependency Walker . Используйте параметр «Профиль» для получения результатов диагностики процесса загрузки. Это определит точку отказа и должно привести вас к решению.

Самая частая причина этой ошибки - попытка загрузить 64-битную DLL в 32-битный процесс или наоборот.

Дэвид Хеффернан
источник
2
+1. Также обратите внимание, что вы должны запустить 32-разрядную версию средства обхода зависимостей и убедиться, что все загруженные библиотеки DLL являются 32-разрядными. Если вы попытаетесь запустить средство проверки зависимостей 64-битной версии, он с удовольствием загрузит 64-битные библиотеки DLL, такие как VCRedist, даже если у вас также есть их 32-битные версии.
Лиорда
12

Это недостающий DLL. Возможно, ваша dll, которая работает с com-портами, имеет неразрешенную зависимость от dll. Вы можете использовать ходок зависимостей и отладчик Windows. Проверьте всю библиотеку mfc, например. Также вы можете использовать nrCommlib - это отличные компоненты для работы с ком-портами.

Alex.kononov
источник
12

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

unxnut
источник
9

В предыдущих ответах было упомянуто, что использование обходчика зависимостей - это путь, в моем случае (мое приложение продолжает сбой с кодом ошибки), обходчик зависимостей показал несколько dll, которые НЕ актуальны!

Наконец-то выяснилось, что я могу запустить профилирование, зайдя в меню «профиль», и оно запустит приложение и остановится на том же самом dll, который вызывает проблему! Я обнаружил, что 32-битная DLL была выбрана из-за пути и исправила ее.

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

pktCoder
источник
5

Недавно у меня возникла проблема, когда я разрабатывал приложение (в котором использовался последовательный порт), и оно работало на всех машинах, на которых я его тестировал, но несколько человек получали эту ошибку.

Оказывается, все машины, на которых произошла ошибка, работали под управлением Win7 x64 и никогда не обновлялись.

Запуск обновления Windows исправил все машины в моем конкретном случае.

mitchfish36
источник
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) На компьютере B я запустил .exe и получил сообщение об ошибке.

4) На ComputerB я посмотрел «Программы и компоненты» и не увидел распространяемого пакета Visual C ++ 2012 (x64).

5) На компьютере B я нашел Google Visual C ++ 2012 Redistributable, выбрал и установил версию x64.

6) На компьютере B я запустил .exe на компьютере B и не получил сообщение об ошибке.

user3731622
источник
3

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

Возможные причины:

  • Microsoft Visual C ++
  • Нужно перезагрузить
  • DirectX
  • .NET Framework
  • Нужно переустановить
  • Необходимо запустить приложение от имени администратора

Источник: http://www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/

Solve101
источник
2

Это может быть случай, когда отладчик может быть полезен. По сути, если вы будете следовать инструкциям здесь, вы можете запустить два ide, и один будет отлаживать в другом. Если вы используете приложение в одном приложении, вы можете иногда обнаруживать ошибки, которые иначе пропустите. Стоит попробовать.

Тоби аллен
источник
2
Это почти наверняка ошибка, о которой сообщает загрузчик, и поэтому она происходит до запуска процесса. Следовательно, отладка не будет вариантом. Конечно, я могу ошибаться в своем диагнозе, что ошибка вызвана загрузчиком.
Дэвид Хеффернан
2

Я видел ошибку при попытке запустить исполняемый файл отладки VC ++ на компьютере, на котором не установлен Visual C ++. Построение релизной версии и ее исправление.

Билл Грир
источник
2

В моем случае ошибка произошла, когда я переименовал библиотеку DLL после ее создания (с помощью Visual Studio 2015), чтобы она соответствовала имени, ожидаемому исполняемым файлом, который зависел от библиотеки DLL. После переименования список экспортированных символов, отображаемый Dependency 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 - это комбинация вики и reddit для знаний; Это хорошая новость для точной ошибки, о которой вы сообщили. Сказав это, у приложений Windows были манифесты сборки, восходящие к Windows 2000; и начиная с Windows XP вы больше не получите последнюю версию comctl32.dll, если ваш манифест сборки не объявил зависимость от него.
Ян Бойд
1

Только что решил эту проблему для моего личного проекта (спасибо Dries за это). Для меня это было потому, что путь проекта был слишком длинным. После сохранения .sln по более короткому пути (C: / MyProjects) и компиляции оттуда он запустился без ошибок.

user1539405
источник
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 ++ Redistributable 2012-2017. Приложение, которое работало с сообщением об ошибке, требовало только VC ++ 2010. Я удалил их все, а затем переустановил только 2010 x86 / x64, и ошибка исчезла, и приложение функционировало, как и ожидалось.

Крис Путнэм
источник
1

Это может произойти, если по какой-то причине ресурс x86 загружен с компьютера x64. Чтобы избежать этого, добавьте директиву препроцессора в stdafx.h (конечно, в моем примере проблемным ресурсом является DLL 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
Майкл Хефрати
источник
1
Общие элементы управления являются частью операционной системы. Операционная система знает, откуда загрузить правильную версию. Это никак не решает проблему ОП. Он даже не устанавливает зависимость. Все, что он делает, это компилирует ресурс манифеста в приложение, чтобы использовать версию 6 общих элементов управления. Условный препроцессор также не нужен. Просто установите processorArchitecture='*', и это все, что нужно сделать.
IInspectable
1

Вполне возможно, что у вас есть несколько версий DLL в вашей системе. Вы можете искать вашу систему, чтобы узнать. Проблема может быть решена простым изменением порядка каталогов на вашем пути. Это была моя проблема. ( Невозможно запустить графический интерфейс Qt Creator за пределами Qt. Ошибка «Не удалось запустить приложение (0xc000007b)» )

Адриан Худ Худ
источник