SysWOW64, winsxs, system32 Как это всё вместе работает?
, 64-bit компьютер, 64-bit windows
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.82] |
|
|
Правила раздела C/C++: Системное программирование и WinAPI
FAQ Сайта (C++)
FAQ Форума
Наши Исходники
Поиск по Разделу
MSDN Library Online (Windows Driver Kit)
Google
SysWOW64, winsxs, system32 Как это всё вместе работает?
, 64-bit компьютер, 64-bit windows
|
Сообщ.
#1
,
|
|
|
|
В Windows 64-bit, системные библиотеки могут подгружаться из трёх разных источников: SysWOW64, winsxs, system32.
В общем хотелось бы знать как это всё работает. Вот что мне известно: ну, system32 - это видимо папка для 64-разрядных программ. Странно только что в конце стоит 32. Все 64-разрядные приложения используют библиотеки оттуда. SysWOW64 - это папка системных библиотек для запуска 32-разрядных приложений на 64-разрядной Windows. Все запускающие 32-разрядные приложения используют библиотеки оттуда. winsxs - насколько я понимаю, это папка куда программы устанавливают свои reistrubutable packages. И вот здесь начинаются непонятки. В этой папке есть как x86 так и 64bit библиотеки. 1) По какому принципу система решает какую библиотеку выбрать из этой папки для запускаемой программы? Ведь в самой программе нет пути к этой самой папке. В этой папке куча каталогов. Такое ощущение что каждая программа туда напихала свои файлы, и ведь дублироваться dLl-ки также могут. Например, несколько программ устанавливают VC++ redistributable package, и для каждой как я понимаю будет создана своя папка. 2) Как система выбирает между использованием папок system32,SysWOW64 или winsxs? |
|
Сообщ.
#2
,
|
|
|
|
Цитата neokoder @ 1) По какому принципу система решает какую библиотеку выбрать из этой папки для запускаемой программы? Ведь в самой программе нет пути к этой самой папке. В этой папке куча каталогов. Такое ощущение что каждая программа туда напихала свои файлы, и ведь дублироваться dLl-ки также могут. Например, несколько программ устанавливают VC++ redistributable package, и для каждой как я понимаю будет создана своя папка. WinSxS -- кеш подсистемы Side-by-Side, призванной разруливать dll-hell. Управляет кешем менеджер s-b-s, а информацию берет из манифестов. Если информация не указана, менеджер предоставляет версии компонентов по-умолчанию |
|
Сообщ.
#3
,
|
|
|
|
Цитата neokoder @ 2) Как система выбирает между использованием папок system32,SysWOW64 или winsxs? Про winsxs очень хорошо напсал B.V.. system32 хранит 64 разрядные версии системных dll. Имя этой папки просто осталось со старых версий windows, специально чтобы старые версии программ можно было перекомпилировать 64 разрядным компилятором без изменения кода(ИМХО). SysWOW64 а вот это уже интересно: WOW64 расшифровывается как windows on windows 64. Когщда 32 разрядное прилдожение запущенное под win64 обращается к папке/файлу лежащему в "system32" система автоматически производит перенаправление в папку "SysWOW64". Тобишь SysWOW64 это system32 для 32 разрядных приложений. Тоже самое происходит и с реестром. |
|
Сообщ.
#4
,
|
|
|
|
Ага, совместимость, будь она не ладна.
|
|
Сообщ.
#5
,
|
|
|
|
Цитата B.V. @ WinSxS -- кеш подсистемы Side-by-Side, призванной разруливать dll-hell. Управляет кешем менеджер s-b-s, а информацию берет из манифестов. Если информация не указана, менеджер предоставляет версии компонентов по-умолчанию B.V., а как эта информация добавляется в манифест? Кем и когда? Вот к примеру у меня проект на VC++ 2010. Я ничего дополнительно не прописываю, значит библиотеки будут по умолчанию, верно? И что надо сделать чтобы принудительно связать моё приложение с конкретной DLL из WinSxS, например msvcr100.dll из vcredist_x86.exe, который я буду устанавливать вместе с приложением? |
|
Сообщ.
#6
,
|
|
|
|
Цитата neokoder @ B.V., а как эта информация добавляется в манифест? Кем и когда? http://msdn.microsoft.com/en-us/library/aa374029.aspx Цитата neokoder @ И что надо сделать чтобы принудительно связать моё приложение с конкретной DLL из WinSxS, например msvcr100.dll из vcredist_x86.exe, который я буду устанавливать вместе с приложением? Добавить её в блок assembly манифеста. Смотри раздел Assembly Manifests по ссылке выше. Там же есть пример манифеста |
|
Сообщ.
#7
,
|
|
|
|
Т.е. как я понял система найдёт нужную DLL по хешу, верно? И в таком случае даже и не важно из какого каталога она будет, главное она будет та самая которая нужна.
Или я не прав? Никаких других механизмов кроме хеша DLL я не нашёл в описании создания Assembly Manifests. |