СЕРВИСНЫЕ УСЛУГИ
СТУДИЯ В ЛИПЕЦКЕ

Советы · Windows · 5 минут

Программа выдаёт 0xc000007b: как найти конфликт разрядности и зависимостей

Что означает 0xc000007b, как проверить архитектуру EXE и DLL, найти фактический путь загрузки и восстановить зависимости без скачивания случайных библиотек.
Microsoft Sysinternals Process Monitor: официальный пример основного окна. Изображение показывает инструмент наблюдения; оно не является трассой ошибки 0xc000007b.

Microsoft Sysinternals Process Monitor: официальный пример основного окна. Изображение показывает инструмент наблюдения; оно не является трассой ошибки 0xc000007b.
© Microsoft. Used with permission from Microsoft. · источник и условия использования · CC BY 4.0

Сохраните точный код и имя файла

Окно «Приложению не удалось правильно запуститься» с 0xc000007b сообщает STATUS_INVALID_IMAGE_FORMAT: загрузчик отклонил исполняемый образ. Несовпадение разрядности — важная гипотеза, но не единственная: сам файл может быть неподходящим или повреждённым. Значение кода дано в спецификации NTSTATUS Microsoft. [1]

Запишите полный текст, имя EXE, версию программы, откуда она установлена и что изменилось перед сбоем. Если в сообщении назван DLL-файл, сохраните его полный путь. Не подменяйте этот код похожими 0xc0000135, «модуль не найден» или ошибкой .NET: их причины и дальнейшие проверки отличаются.

Что нужно установить
  1. ПроцессКакой именно EXE запускается
  2. ЗависимостьКакую DLL он пытается загрузить
  3. ПутьОткуда фактически взят файл
  4. СовместимостьПодходит ли этот комплект процессу

Схема редакции «Мы из 90х».

Сравнивайте DLL с процессом, а не только с Windows

На 64-битной Windows могут работать и 32-битные программы. Нативный x86-процесс не загружает x64-DLL внутрь своего адресного пространства, как и наоборот. Поэтому установка только x64-комплекта среды не обязательно обеспечивает зависимости x86-приложения. [2], [3]

Упрощённое сравнение нативных компонентов
ПроцессDLL в этом процессе
x86Нужен совместимый x86-компонент
x64Нужен совместимый x64-компонент
ARM64 или смешанные технологииНужны правила платформы и поставщика приложения

Таблица не описывает все варианты .NET AnyCPU, ARM64EC и межпроцессного взаимодействия.

Учебная таблица редакции.

Разные процессы могут обмениваться данными и при разной архитектуре; это не делает их DLL взаимозаменяемыми. Для плагина проверяйте архитектуру хост-программы. Наличие папки Program Files (x86) полезно как подсказка, но не является окончательным исследованием каждого лежащего там файла.

Проверьте файлы с помощью инструментов Microsoft

Скачайте Sigcheck только со страницы Microsoft Sysinternals, распакуйте и прочитайте лицензию. Для конкретных EXE и подозрительной DLL можно получить расширенные сведения и хеш:

Командная строка · учебные пути

sigcheck.exe -a -h "C:\Apps\Example\Example.exe"
sigcheck.exe -a -h "C:\Apps\Example\plugin.dll"

Смотрите тип образа, версию и сведения о подписи. Поля и возможности зависят от версии инструмента. Подпись не доказывает, что файл подходит этому приложению; отсутствие подписи тоже не доказывает повреждение. Параметры VirusTotal для этой проверки не нужны. [4]

Если установлен инструментарий Visual Studio C++, в Developer Command Prompt есть DUMPBIN:

Developer Command Prompt · учебные пути

dumpbin /headers "C:\Apps\Example\Example.exe"
dumpbin /headers "C:\Apps\Example\plugin.dll"

Сравните поле Machine в заголовках. DUMPBIN не входит в обычную установку Windows; сообщение «не является командой» означает отсутствие инструмента или нужного окружения. Для управляемых сборок .NET и специальных архитектур нужен анализ конфигурации проекта, а не один вывод о Machine. [5]

Выясните фактический путь загрузки

Соседняя с EXE библиотека может иметь такое же имя, как системная. В Windows существуют правила поиска DLL, известные системные DLL, манифесты и другие механизмы загрузки. Порядок зависит от типа приложения и применённых режимов; нельзя считать, что любой процесс всегда берёт первый файл из PATH. [6]

В Process Monitor остановите захват, очистите текущие события, задайте фильтр по нужному имени процесса, начните запись и воспроизведите один запуск. Затем остановите захват. Учитывайте, что запускающий EXE может создавать другой процесс: проверьте дерево процессов и время. Отберите обращения к файлам DLL и события загрузки образов, сохраняя исходную трассу. [7]

Неудачно отклонённая DLL может проявиться как обращение к файлу до успешного события Load Image. Поэтому отсутствие её в списке загруженных модулей не доказывает, что загрузчик к ней не обращался. Отдельная строка NAME NOT FOUND может быть нормальной пробой очередного пути.

Microsoft Sysinternals Process Monitor: пример свойств события с информацией о процессе. Для своего случая фиксируйте PID, путь и время, а не копируйте значения с иллюстрации.
Microsoft Sysinternals Process Monitor: пример свойств события с информацией о процессе. Для своего случая фиксируйте PID, путь и время, а не копируйте значения с иллюстрации.© Microsoft. Used with permission from Microsoft. · источник и условия использования · CC BY 4.0

Сопоставьте трассу с недавними изменениями

Полезные вопросы: ошибка началась после обновления, установки плагина, ручного копирования DLL или переноса папки с другого компьютера? Совпадает ли отказ у чистой официальной установки той же версии? Есть ли в каталоге приложения лишняя библиотека, которую добавляли отдельно?

Скопируйте журнал и сведения о подозрительном файле до изменений. Для программы с функцией проверки файлов используйте штатную проверку поставщика; для обычного установщика — Repair или восстановление той же поддерживаемой версии. Если приложение распространяется комплектом локальных библиотек, обновляют согласованный комплект, а не один файл по совпадению имени.

У .NET-приложения нативный плагин способен создать архитектурный конфликт даже при правильной установленной .NET-среде. Ошибка не всегда решается переустановкой самой Windows.

Как оценивать найденную зависимость
НаблюдениеПредел вывода
DLL не подходит архитектуре процессаПодтверждён конфликт для этой пары
DLL подписанаПроверено происхождение подписи, не совместимость
Одна проба пути дала NAME NOT FOUNDПоиск мог продолжиться в другом месте
Repair изменил локальную DLL и запуск восстановилсяЕсть связь с комплектом приложения
Сбой остался после установки средыНужно проверить реально выбранный путь

Учебная таблица редакции.

Восстановите нужный Visual C++ Redistributable

Если приложение требует Visual C++, сверяйте поколение и архитектуру среды с документацией поставщика. Пакеты x86 и x64 устанавливаются раздельно и могут требоваться одновременно. Современный поддерживаемый пакет семейства v14 не заменяет автоматически Visual C++ 2013 и более старые семейства. Microsoft публикует отдельные ссылки и условия совместимости. [3]

Используйте официальный установщик Microsoft и его Repair, если он доступен. После восстановления перезапустите программу и повторите тот же сценарий. Если несовместимая DLL лежит рядом с EXE, установка системной среды не обязана изменить выбранный локальный файл.

Не скачивайте DLL с сайтов «все библиотеки»: имя не гарантирует архитектуру, версию и происхождение. Regsvr32 предназначен для регистрации поддерживающих это COM-компонентов; он не является универсальной командой исправления любой DLL.

Не путайте системные каталоги разных архитектур

На x64-Windows имена System32 и SysWOW64 исторически не означают соответственно «32-битные» и «64-битные» библиотеки. В первом находятся нативные системные компоненты, во втором — компоненты среды 32-битных приложений; для 32-битного процесса также действует перенаправление файловой системы. [8]

Не копируйте вручную одну DLL между этими папками и не удаляйте системную библиотеку ради эксперимента. Если подтверждено повреждение системных компонентов, используйте штатную проверку Windows и её журналы. Но набор DISM/SFC не должен подменять исследование приложения, у которого испорчен собственный каталог.

Что считать подтверждённым исправлением

Программа запускает тот же EXE, использует согласованные зависимости и повторяет исходную операцию без ошибки. Сохраните, что именно было восстановлено: версия приложения, конкретный плагин или пакет среды. Если после изменения исчезла только первая ошибка и появилась другая, исследование ещё не закончено.

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

Made on
Tilda