Как устранить неполадки, связанные с невозможностью запуска приложения с STATUS_DLL_INIT_FAILED (0xc0000142) после Windows 10 «Порог 2» обновление (1511, сборка 15086)

Мы публикуем настольное приложение Windows (созданное с помощью Visual C ++ 2013 с набором инструментов платформы v120_xp), которое отлично работало в Windows 10, но мы начали получать отчеты от пользователей, которые установили обновление «Порог 2», которое наше приложение теперь не может начать, показывая следующее сообщение об ошибке:

Приложение не удалось запустить правильно (0xc0000142). Нажмите кнопку ОК, чтобы закрыть приложение.

Код ошибки — STATUS_DLL_INIT_FAILED, поэтому мы, вероятно, ищем DLL, которая не может быть инициализирована.

Мы предприняли несколько попыток решить эту проблему, наблюдая за запуском приложения в отладчике и используя Process Monitor, чтобы увидеть, какие DLL загружаются. Последняя загруженная DLL-библиотека (на компьютере с установленным Threshold 2) — «davhlpr.dll». Когда мы наблюдаем, как наше приложение запускается в Windows 10 без Threshold 2, оно запускается без видимой загрузки этой DLL. Это говорит о том, что проблема может быть связана с davhlpr.dll, но наш код явно не зависит от этой библиотеки DLL, и я понятия не имею, что это такое.

Кто-нибудь еще видел что-нибудь подобное?

У кого-нибудь есть идеи относительно того, как мы можем устранить эту проблему? Попробовав отладчик и Process Monitor, у меня закончились идеи.

6

Решение

В конце концов мы дошли до сути. Подход, который мы выбрали, был следующим:

  1. Скажите компоновщику отложить загрузку всех библиотек DLL, от которых зависит наше приложение (отложить любые проблемы инициализации до момента запуска приложения).
  2. Работайте с приложением до тех пор, пока оно не сломалось, что оказалось при загрузке comdlg32.dll для отображения диалогового окна «Открыть».
  3. Создать простую тестовую программу, которая просто использует comdlg32.dll, чтобы показать диалог «Открыть».
  4. Запустите тестовую программу в Windows 10 build 15086 и посмотрите, какие DLL она загружает, сравнивая ее с DLL, которые загружаются, когда мы запускаем диалоговое окно «Открыть» в загруженной с задержкой версии нашего приложения.

Короче говоря: выясняется, что сбой произошел из-за компонента Windows под названием «fwbase.dll» (по-видимому, часть брандмауэра Windows), который по какой-либо причине пытался загрузить comdlg32.dll. Наше приложение включало компонент с именем «fwBase.dll» (часть библиотеки AMD Framewave), и загрузчик Windows, по-видимому, не пытался загрузить fwbase.dll, так как считал, что он уже загружен. Катастрофа последовала вскоре после этого.

На данный момент, я не уверен, является ли это ошибкой в ​​Windows или чем-то, но мы решили ее, переименовав fwBase.dll.

5

Другие решения

Я столкнулся с аналогичной проблемой, когда программа скомпилирована & запущена без каких-либо проблем на Win 7 (также на сервере Win 2008), но не удалась для машины с Win 10. Один из приемов, который мне помог, заключался в «устранении неполадок» исполняемого файла (с использованием ОС Win 10).

  • Щелкните правой кнопкой мыши на исполняемый файл & выберите опцию «Устранение неполадок совместимости».
  • Затем выберите «Программа устранения неполадок» & затем выберите «Программа работала в более ранней версии Windows». (1-й флажок.)
  • Выберите ОС (у меня была Win 7) и перейдите к следующим шагам.

Обязательно «Протестируйте программу» и двигайтесь дальше, чтобы наконец выбрать опцию «Сохранить настройки».

0

По вопросам рекламы [email protected]