Приложение не удалось запустить правильно (0xc000007b)
У меня есть клиент/сервер приложение, которое я разрабатываю на одном ПК. Теперь ему нужны два последовательных порта, поэтому я позаимствовал компьютер у друга.
когда я создаю свое приложение и пытаюсь запустить или отладить его (будь то в Delphi IDE или из файлового менеджера Windows), он выдает ошибку "приложение не удалось правильно запустить (0xc000007b)".
Googling не вызывает много, но, похоже, указывает на то, что это не что-то конкретное Delphi и происходит с другими приложениями. Вроде бы вызвано вызовом 32-разрядной DLL из 64-разрядного приложения или наоборот.
- оба ПК Windows 7, 64 бит
- оба имеют Delphi Xe2 starter edition, который может обрабатывать только 32 бита
- приложение отлично работает на моем компьютере, но не на моем друге
- другие приложения Delphi работают просто отлично на обоих ПК
может кто-нибудь дать мне подсказку о том, как отследить?
16 ответов:
для начала я бы предложил проверить, есть ли проблема между вашим приложением и его зависимостями с помощью dependency walker
зависимость времени загрузки не может быть решена. Самый простой способ отладить это-использовать Dependency Walker. Используйте параметр профиль, чтобы получить диагностический вывод процесса загрузки. Это позволит определить точку отказа и должно привести вас к решению.
наиболее распространенной причиной этой ошибки является попытка загрузить 64-битную DLL в 32-битный процесс или наоборот.
Это отсутствует dll. Возможно, ваша dll, которая работает с COM-портами, имеет неразрешенную зависимость от dll. Вы можете использовать Dependency walker и отладчик windows. Например, проверьте всю библиотеку mfc. Кроме того, вы можете использовать nrCommlib - это отличные компоненты для работы с COM-портами.
Я перепробовал все указанные здесь вещи и нашел еще один ответ. Мне пришлось скомпилировать свое приложение с 32-битными DLL. Я построил библиотеки как в 32-битной, так и в 64-битной версии, но у меня было
PATHустановите 64-разрядные библиотеки. После того, как я перекомпилировал свое приложение (с рядом изменений в моем коде), я получил эту страшную ошибку и боролся в течение двух дней. Наконец, попробовав ряд других вещей, я изменил свойPATHчтобы иметь 32-разрядные библиотеки DLL перед 64-разрядными библиотеками DLL (они имеют то же самое имена.) И это сработало. Я просто добавляю его здесь для полноты.
в предыдущих ответах упоминалось, что использование dependency walker-это путь, в моем случае (мое приложение продолжает отказывать с кодом ошибки), dependency walker показал несколько dll, которые не имеют отношения!
наконец-то понял, что я могу запустить профилирование, перейдя в меню "Профиль", и он запустит приложение и остановится на точной dll, которая вызывает проблему! Я узнал, что 32-битная dll была выбрана из-за пути и исправлена оно.
недавно у меня была проблема, когда я разрабатывал приложение (которое использовало последовательный порт), и оно работало на всех машинах, на которых я его тестировал, но несколько человек получали эту ошибку.
оказывается, все машины, на которых произошла ошибка, работали под управлением Win7 x64 и никогда не обновлялись.
запуск Центра обновления Windows исправил все машины в моем конкретном случае.
на самом деле эта ошибка указывает на недопустимый формат изображения. Однако, почему это происходит и что обычно означает Код ошибки? На самом деле это может появиться, когда вы пытаетесь запустить программу, которая предназначена для работы с 64-разрядной операционной системой Windows, но ваш компьютер работает на 32-разрядной операционной системе.
Возможные Причины:
- Microsoft Visual C++
- нужно перезапустить
- DirectX
- .NET Рамки
- необходимо переустановить
- необходимо запустить приложение от имени администратора
Я испытал ту же проблему, разрабатывая клиент-серверное приложение с помощью 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 на мой компьютер. Назовем мой компьютер компьютер.
2) я установил .exe и связанные файлы на другом компьютере мы будем называть ComputerB.
3) на ComputerB, я побежал .exe и получил сообщение об ошибке.
4) на ComputerB я посмотрел на программы и функции и не увидел распространяемого Visual C++ 2012 (x64).
5) на ComputerB я погуглил для распространяемого Visual C++ 2012 и выбрал и установил x64 версия.
6) на ComputerB, я побежал .exe на ComputerB и не получил сообщение об ошибке.
Это может быть случай, когда отладка отладчика может быть полезна. По сути, если вы будете следовать инструкция тут вы можете запустить две ide, и один будет отлаживаться в другой. Если вы un ваше приложение в одном, вы можете иногда ловить ошибки, которые вы в противном случае пропустите. Его стоит попробовать.
Я видел ошибку при попытке запустить исполняемый файл отладки VC++ на машине, на которой не установлен Visual C++. Создание версии выпуска и использование этого исправили его.
в моем случае ошибка произошла, когда я переименовал DLL после ее создания (используя Visual Studio 2015), чтобы она соответствовала имени, ожидаемому исполняемым файлом, который зависел от DLL. После переименования список экспортированных символов, отображаемый Dependency Walker, был пуст, и появилось сообщение об ошибке "приложение не удалось запустить правильно".
таким образом, это можно исправить, изменив имя выходного файла в параметрах компоновщика Visual Studio.
просто решил эту проблему для моего личного проекта (Спасибо Dries за это). Для меня это было, потому что путь слишком длинный. После сохранения .sln к более короткому пути (C:/MyProjects) и компиляция оттуда он побежал без ошибки.
также загрузите и распакуйте "зависимости" в ту же папку, в которую вы поместили wget.exe из
http://gnuwin32.sourceforge.net/packages/wget.htm
вы будете иметь некоторые lib*.dll файлы, а также wget.exe в той же папке, и он должен работать нормально.
(Я тоже ответил Здесь https://superuser.com/a/873531/146668 который я первоначально нашел.)
Я просто столкнулся с этой проблемой. Я искал "C++ "в разделе" Приложения и функции " в панели управления Windows 10 и заметил, что какое-то обновление было запущено за несколько дней до этого и установлено VC++ Redistributable 2012-2017. Приложение, которое запускалось в сообщение об ошибке, требовало только VC++ 2010. Я удалил все из них, а затем переустановил только 2010 x86/x64, и ошибка ушла, и приложение функционировало так, как ожидалось.
Это может произойти, если по какой-то причине ресурс x86 загружен с машины x64. Чтобы избежать этого, явно, добавьте эту директиву препроцессора в файл stdafx.h (конечно, в моем примере проблемным ресурсом является 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
Вы можете иметь это, если вы пытаетесь проявить свое приложение, которое имеет зависимость на Microsoft.Окна.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>Раймонд Чен имеет прекрасную историю общих элементов управления:

Comments