Есть система 8.1 Enterprise(обновлено из 8 Enterprise).
Всё вроде работало но периодический напарываюсь на приложения которые тупо не работают. Вскрытие показывает что случается это по такому странному поводу:
1. Одна из прикладных DLL приложения(foo.dll) зависит от системных библиотек user32.dll kernel32.dll advapi32.dll msvcrt.dll (ничего необычного).
2. В своем тестовом приложении пытаюсь делать LoadLibraryW("foo.dll") получаю NULL GetLastError() = 126(MODULE_NOT_FOUND) O_o
3. Вооружаюсь DependencyWalker-ом, смотрю на foo.dll, и что я вижу:
FOO.DLL
+ USER32.DLL
| + API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL (не найден модуль)
| + API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL (не найден модуль)
+ ADVAPI32.DLL
+ API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL (не найден модуль)
Вот тут у меня ступор: как не найдено? Часть системных компонент куда делось? Пошел искать руками. Нашел кучу подобных файлов %systemroot%\system32 но пациентов среди них не оказалось, оказались братья в имени которых в конце -L1-1-0 вместо -L1-1-1. Пошел искать дальше. Пациенты нашлись в %systemroot%\system32\downlevel. Но система их не видит.
Вопрос: что не так?
Ладно, попробовал "исправить" путем прописывания %systemroot%\system32\downlevel в PATH. Лучше не стало. DepWalker теперь находит модули, но матерится на отсутствующие символы в них.
Microsoft Redistributable for Visual C++ 20xx ставил все какие мог — не помогало.
Пробовал запускать тестовое приложения в различных режимах совместимости(8, 7, Vista) — ноль на массу.
Кто знает как лечить? (без переустановки) Надо работать с этими модулями программно. Да и если на клиенте такая фигня случится, хочется знать что крутить.
Да, да. Меня уже тошнит от похожих проблем Гуглить умею. Там чувак вылечил путем доустановки redist-а, что я уже пытался делать не раз. Это спасало в своё время на ХР, когда эту фигню только добавили(инсталятор видел что он на ХР и доустанавливал эти компоненты в систему), но тут номер не проходит.
Здравствуйте, PanychY, Вы писали:
PY>Да, да. Меня уже тошнит от похожих проблем Гуглить умею. Там чувак вылечил путем доустановки redist-а, что я уже пытался делать не раз. Это спасало в своё время на ХР, когда эту фигню только добавили(инсталятор видел что он на ХР и доустанавливал эти компоненты в систему), но тут номер не проходит.
Вообще-то то, что происходит, как-то не очень понятно. Нет ведь у твоей foo.dll прямых импортов из этих жутких DLL, только от user32.dll. А ей и разбираться в своих импортах. Как вообще система работает, если у user32.dll неразрешенные импорты ?
У меня все эти 1-1 версии есть, но у меня Windows 10. Кстати, не в самом system32, а в его downlevel, в самом system32 таких вообще нет
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Вообще-то то, что происходит, как-то не очень понятно. Нет ведь у твоей foo.dll прямых импортов из этих жутких DLL, только от user32.dll. А ей и разбираться в своих импортах. Как вообще система работает, если у user32.dll неразрешенные импорты ?
А черти что там делается. Об остальных моих квестах я промолчу. Их особо много было при установке MSVS 2015 Update 3. Судя по гуглу очевидно что страдает старый софт(завязанные на старые msvcrt.dll, которые смотрят на удаленные символы). Прикол в том что эта фигня с разбиением системных библиотек на кусочки началась совсем недавно(WinRT что-ли), и они придумали/заиспользовали какой-то механизм частичной загрузки библиотек что-ли. Черт их знает.
PD>У меня все эти 1-1 версии есть, но у меня Windows 10. Кстати, не в самом system32, а в его downlevel, в самом system32 таких вообще нет
Да, да, я об этом и написал. Не знаю что там у 10, но думаю что от 8.1 отличаться не должно.
Что интересно, уговорил коллегу попробовать у себя провести тест — тот же результат(только у меня 8 Ent -> 8.1 Ent, а у него 8 Pro ->8.1 Pro). В downlevel лежат те же файлы, и т.д. (да, я мог сломать систему себе, но коллеге то не мог же! значит сломало что-то другое)
Что гадать то Качните отсюда, распакуйте и попробуйте вот таким кодом:
Здравствуйте, PanychY, Вы писали:
PY>msvcrt.dll (ничего необычного)
Это очень подозрительно, скорее всего вам надо раздобыть и подсунуть оригинальную msvcrt.dll с которой может работать данная библиотека, а не пытаться использовать системную.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, VTT, Вы писали:
VTT>Здравствуйте, PanychY, Вы писали:
PY>>msvcrt.dll (ничего необычного)
VTT>Это очень подозрительно, скорее всего вам надо раздобыть и подсунуть оригинальную msvcrt.dll с которой может работать данная библиотека, а не пытаться использовать системную.
Вот какраз она впорядке. Не в порядке USER32.DLL(и вообще)
Здравствуйте, PanychY, Вы писали:
PY>Не в порядке USER32.DLL(и вообще)
Может и глупый вопрос, а антивирус какой-то установлен?
Я к чему. Спрашиваю у коллег, а как вообще сейчас работают антивирусы? В смысле физически чего делают с Win? Никто не знает. Ну работают и работают. Тебе какое дело?
А я получал от пользователей скриншоты из серии "то, чего не может быть". Виноват оказался Семантик, у которого чего-то там полетело...
Здравствуйте, кт, Вы писали:
кт>Может и глупый вопрос, а антивирус какой-то установлен?
кт>Я к чему. Спрашиваю у коллег, а как вообще сейчас работают антивирусы? В смысле физически чего делают с Win? Никто не знает. Ну работают и работают. Тебе какое дело? кт>А я получал от пользователей скриншоты из серии "то, чего не может быть". Виноват оказался Семантик, у которого чего-то там полетело...
Изкоробочный Windows Defender. И то я его отключил(да так что включить не могу — служба при запуске начинает активно "рипеть" винтом и так и не стартует). У коллеги тоже(но проблем он не имеет с его включением). Машина в домене(даже так, оно пережило миграцию между доменами), думаю мало на что влияет. Где-то выше я запостил пример анамнеза от Dependency Walker-а. Если есть желание можете попробовать у себя тестовым приложением.
Здравствуйте, PanychY, Вы писали:
PY>3. Вооружаюсь DependencyWalker-ом, смотрю на foo.dll, и что я вижу: PY>
FOO.DLL
PY> + USER32.DLL
PY> | + API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL (не найден модуль)
PY> | + API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL (не найден модуль)
PY> + ADVAPI32.DLL
PY> + API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL (не найден модуль)
PY>
PY>Вот тут у меня ступор: как не найдено? Часть системных компонент куда делось? Пошел искать руками. Нашел кучу подобных файлов %systemroot%\system32 но пациентов среди них не оказалось, оказались братья в имени которых в конце -L1-1-0 вместо -L1-1-1. Пошел искать дальше. Пациенты нашлись в %systemroot%\system32\downlevel. Но система их не видит.
Забудь. Это проблемы dependency walker'а.
Вместо него попробуй Sxstrace использовать.
Здравствуйте, Lexey, Вы писали:
L>Забудь. Это проблемы dependency walker'а. L>Вместо него попробуй Sxstrace использовать.
Даже DepWalker о чем-то не в курсе, то при запуске тестового приложения его проблемы точно ни при чем.
А утилиту попробую, но пишет что 2012год, и я думаю она совсем не вкурит что тут не так.
*лядство в том, что даже если я это починю у себя(на машине разработчика), я не смогу заставить то-же самое сделать клиентов на своих машинах(если для этого нужно вывернуть кишки винды наружу, к чему относится трах с SXS). Тем более что то, чем я занимаюсь скорее приятный бонус для полноты картины(после портирования софта на x86_64) чем необходимость(2 года обходятся).
Ты не понял. То, что Debends.exe не показывает все эти библиотеки виноват сам Depends.exe. Он их и у меня для любого приложения или DLL не показывает, но при этом все эти приложения и DLL работают.
Здравствуйте, PanychY, Вы писали:
PY>А утилиту попробую, но пишет что 2012год, и я думаю она совсем не вкурит что тут не так.
Механизм SxS давно был придуман. И едва ли там что-то менялось в 2012 года. Так что, не ясно, почему она должна "не вкурить"?
PY>*лядство в том, что даже если я это починю у себя(на машине разработчика), я не смогу заставить то-же самое сделать клиентов на своих машинах(если для этого нужно вывернуть кишки винды наружу, к чему относится трах с SXS). Тем более что то, чем я занимаюсь скорее приятный бонус для полноты картины(после портирования софта на x86_64) чем необходимость(2 года обходятся).
Если у тебя проблема с версиями рантаймовых библиотек VC++ (что наиболее вероятно), то у клиентов она решается не трахом с Sxstrace, а установкой у него той же версии рантайма, с которой собиралось приложение. Или сборкой со статическим рантаймом.
Здравствуйте, Lexey, Вы писали:
L>Здравствуйте, PanychY, Вы писали:
PY>>А утилиту попробую, но пишет что 2012год, и я думаю она совсем не вкурит что тут не так.
L>Если у тебя проблема с версиями рантаймовых библиотек VC++ (что наиболее вероятно), то у клиентов она решается не трахом с Sxstrace, а установкой у него той же версии рантайма, с которой собиралось приложение. Или сборкой со статическим рантаймом.
Здравствуйте, CEMb, Вы писали:
PY>> Черт их знает. CEM>MS хитрым образом отучает нас от прямого использования WinAPI
А не старые ли функции пробуют выкинуть?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, PanychY, Вы писали:
PY>При чем тут рантайм? user32.dll нифига не рантайм. Топик читали?
В старом понимании не рантайм.
PY> + API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL (не найден модуль) PY> + API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL (не найден модуль) PY> + API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL (не найден модуль)[/code]
^^^^^^^^^^^^^^^^^^^^^^^^^^^
а здесь уже версия указана, чем не рантайм?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали: PY>>При чем тут рантайм? user32.dll нифига не рантайм. Топик читали? V>В старом понимании не рантайм. V>а здесь уже версия указана, чем не рантайм?
Линкуюсь прямо с user32.dll kernel32.dll advapu32.dll — WIN32 Platform API. Как оно дальше, какие там версии меня не особо интересует, главное чтобы работало
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, CEMb, Вы писали:
PY>>> Черт их знает. CEM>>MS хитрым образом отучает нас от прямого использования WinAPI V>А не старые ли функции пробуют выкинуть?
Ничего там не выкинули. Поясняю:
Есть такая вещь называется GNU Aspell Spellchecker
С точки зрения пользователя это aspell.exe зависящий от LIBASPELL-15.DLL+LIBGCC_S_SEH-1.DLL+LIBICONV-2.DLL+LIBINTL-8.DLL+LIBSTDC++-6.DLL+KERNEL32.DLL+USER32.DLL+MSVCRT.DLL
С точки зрения разработчика это libaspell-15.dll зависящий от LIBINTL-8.DLL+LIBSTDC++-6.DLL+KERNEL32.DLL+USER32.DLL+MSVCRT.DLL
Так вот, запускаю aspell.exe — всё работает.
Из своего приложения гружу libaspell-15.dll — полный облом.
Вопрос: чем отличается выхлоп x86_64-w-mingw32(aspell.exe) от выхлопа MSVS 2015(TestAspellx64.exe — тестовое приложение). Чего ему не хватает то?