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

122

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

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

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

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

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

  • 5
    Кроме того, вы можете использовать com0com для установки виртуальных последовательных портов на одном ПК. Отлично подходит для отладки и тестирования, просто создайте 2 виртуальных порта и свяжите их вместе в конфигурации, а затем запустите свои приложения на каждом порту, чтобы они могли общаться друг с другом.
  • 1
    Вы проверяли журнал событий Windows? Иногда Windows предоставляет больше информации о том, какая DLL сделала приложение неудачным.
Показать ещё 5 комментариев
Теги:
64bit

15 ответов

113
Лучший ответ

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

  • 26
    на основе кодов ошибок Windows ( google.de/… ) этот код ошибки означает: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
  • 83
    Что является хорошим показателем того, что 32-битное приложение пыталось загрузить 64-битную DLL.
Показать ещё 6 комментариев
41

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

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

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

Это недостающая dll. Возможно, ваша DLL, которая работает с COM-портами, имеет нерешённую зависимость от dll. Вы можете использовать зависимый ходок и отладчик окон. Например, проверьте всю библиотеку mfc. Кроме того, вы можете использовать nrCommlib - отличные компоненты для работы с COM-портами.

9

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

6

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

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

Изображение 7344

5

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

Оказывается, все машины, на которых произошла ошибка, выполняли Win7 x64 и обновлялись НИКОГДА никогда.

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

3

У меня возникла та же проблема при разработке приложения клиент-сервер с использованием Microsoft Visual Studio 2012.

Если вы использовали Visual Studio для разработки приложения, вы должны убедиться, что новый (т.е. компьютер, на котором не было разработано программное обеспечение) имеет соответствующий распространяемый пакет Microsoft Visual С++. Соответственно, вам нужна правильная версия года и бит (то есть x86 для 32-разрядных и 64-разрядных 64-разрядных версий) распространяемого пакета Visual С++.

Распространяемые пакеты Visual С++ устанавливают компоненты времени выполнения, необходимые для запуска приложений на С++, созданных с использованием Visual Studio.

Вот ссылка на Visual С++ Redistributable для Visual Studio 2015.

Вы можете проверить, какие версии установлены, выбрав "Панель управления" → "Программы" - "Программы и функции".

Вот как я получил эту ошибку и исправил ее:

1) Я разработал 32-битное приложение, использующее Visual Studio 2012 на моем компьютере. Позвоните на мой компьютер ComputerA.

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

3) В ComputerB я запустил .exe и получил сообщение об ошибке.

4) В ComputerB я просмотрел программы и функции и не видел Redistributable (x64) Visual С++ 2012.

5) В ComputerB я googled для Visual С++ 2012 Распространяем и выбираем и устанавливаем версию x64.

6) В ComputerB я запустил .exe в ComputerB и не получил сообщение об ошибке.

3

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

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

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

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

2

В моем случае ошибка произошла, когда я переименовал DLL после ее создания (используя Visual Studio 2015), чтобы он соответствовал имени, ожидаемому исполняемым файлом, который зависел от DLL. После переименования список экспортированных символов, отображаемых Dependency Walker, был пуст, и было отображено сообщение об ошибке "Приложение не удалось запустить правильно".

Таким образом, это можно было бы исправить, изменив имя выходного файла в параметрах компоновщика Visual Studio.

2

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

2
  • 2
    Это почти наверняка ошибка, о которой сообщает загрузчик, и поэтому она возникает до запуска процесса. Следовательно, отладка не будет вариантом. Конечно, я могу ошибаться в своем диагнозе, что ошибка возникает из-за загрузчика.
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

Я просто столкнулся с этой проблемой. Я искал "С++" в своих "Приложениях и функциях" в панели управления Windows 10 и заметил, что какое-то обновление просто запустилось за несколько дней до этого и установило VС++ Redistributable 2012-2017. Приложение, которое запускалось в сообщение об ошибке, требовало только VС++ 2010. Я удалил все из них, а затем переустановил только 2010 x86/x64, и ошибка исчезла, и приложение функционировало, как ожидалось.

1

Также загрузите и распакуйте "Зависимости" в ту же папку, где вы помещаете wget.exe из

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

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

(Я также ответил здесь https://superuser.com/a/873531/146668, который я изначально нашел.)

1

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

  • 1
    @jojodmo: на самом деле, «для меня это было потому, что путь к проекту был слишком длинным», мне кажется, является весомым вкладом в поиск ошибок ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню