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

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

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

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

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

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

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


person Anodyne    schedule 18.11.2015    source источник
comment
davhlpr.dll, похоже, используется для WebDAV (msdn.microsoft. com/en-us/library/windows/desktop/dd408159.aspx). Стек вызовов в отладчике может дать некоторые подсказки относительно того, что инициирует его загрузку.   -  person dxiv    schedule 19.11.2015


Ответы (2)


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

  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.

person Anodyne    schedule 01.12.2015

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

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

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

person Shrinivas    schedule 21.08.2018