Сначала были windows api и dll hell
. when altering one's mind becomes as easy as programming a computer, what does it mean to be human.
среда, 11 ноября 2015 г.
Выбираемся из DLL Hell
Это перевод Getting Out of DLL Hell. Автор: Реймонд Чен.
DLL HELL. Проблема настолько коварна, что она имеет своё собственное негативное прозвище. Вы устанавливаете одну программу, и вдруг какая-то другая, казалось бы, не связанная программа перестаёт работать. Это потому, что, хотя вам это неизвестно, но две программы связаны через общий файл DLL. Эти две программы могут иметь различные идеи о том, какую версию файла MSVCRT.DLL нужно хранить в системном каталоге. Или первая программа может обновить элемент управления ActiveX, который также использует вторая программа - сделать обновление, с которым вторая программа не полностью совместима.
Если обе программы имеют важное значение для повседневных операций вашей компании, то для вас, на самом деле, не имеет значения, какая программа виновата. Важно то, что вам нужно заставить работать их обе. Существует не так много различий между "Мы теряем деньги" и "Мы теряем деньги из-за Боба". В любом случае ваша компания теряет деньги - и это ваша работа, решить эту проблему сразу.
Когда-то давно вам приходилось выбирать какая программа "выиграла", а какая - "проиграла". Но сейчас (начиная с Windows 2000) вам доступны способы разрешения таких конфликтов. Эти способы, однако, являются лишь временными решениями, чтобы вернуть вашу систему в рабочее состояние, пока вы/разработчики программ исследуете более постоянное решение конфликта.
В Windows 2000 реализована минимальная версия технологии, поставляемой сейчас под модным названием Dynamic-Link Library Redirection (перенаправление библиотек динамической компоновки). Чтобы включить перенаправление библиотеки DLL, создайте файл с тем же именем, что и файл программы, для библиотек DLL которой требуется перенаправление, но добавив .local к имени файла. Например, чтобы использовать перенаправление для программы C:\Program Files\Litware Inc\Invoice.exe следует создать файл C:\Program Files\Litware Inc\Invoice.exe.local . Содержимое файла не имеет значения; важен сам факт существования этого файла.
Осталось только заметить что .local файлы и папки игнорируются, если приложение использует манифесты для управления зависимостями.
Перенаправление библиотек DLL не позволит полностью избежать кошмара библиотек DLL, но, по крайней мере, оно предоставляет средства первой помощи для контроля над ситуацией на время решения проблемы.
Сначала были Windows API и DLL Hell. Революцией №1 стало появление DDE – помните, как ссылки позволили нам создавать статусные строки, отражающие текущую цену акций Microsoft? Примерно тогда же Microsoft создала ресурс VERSION INFO, исключающий DLL Hell. Но другая группа в Microsoft нашла в DDE фатальный недостаток – его писали не они!
Для решения этой проблемы они создали OLE (похожее на DDE, но другое), и я наивно вспоминаю докладчика на Microsoftовской конференции, говорящего, что скоро Windows API перепишут как OLE API, и каждый элемент на экране будет ОСХ-ом. В OLE появились интерфейсы, исключающие DLL Hell. Помните болезнь с названием «in place», при которой мы мечтали встроить все свои приложения в один (возможно, очень большой) документ Word? Где-то в то же время Microsoft уверовала в религию С++, и возникли MFC, решившие все наши проблемы еще раз.
Но OLE не собиралось, сложа руки смотреть на это, поэтому оно заново родилось под именем COM, и мы внезапно поняли, что OLE (или это было DDE?) будет всегда – и даже включает тщательно разработанную систему версий компонентов, исключающую DLL Hell. В это время группа отступников внутри Microsoft обнаружила в MFC фатальный недостаток – их писали не они! Они немедленно исправили этот недочет, создав ATL, которая как MFC, но другая, и попытались спрятать все замечательные вещи, которым так упорно старалась обучить нас группа COM. Это заставило группу COM (или это было OLE?) переименоваться в ActiveX и выпустить около тонны новых интерфейсов (включая интерфейсы контроля версий, исключающие DLL Hell), а заодно возможность сделать весь код загружаемым через браузеры, прямо вместе с определяемыми пользователем вирусами (назло этим гадам из ATL!).
Группа операционных систем громким криком, как забытый средний ребенок, потребовала внимания, сказав, что нам следует готовиться к Cairo (Windows NT 5.0 - Д.М.), некоей таинственной хреновине, которую очень долго не могли даже толком описать, не то, что выпустить. К их чести, следует сказать, что они не представляли концепции «System File Protection», исключающей DLL Hell. Но тут некая группа в Microsoft нашла фатальный недостаток в Java - её писали не они! Это было исправлено созданием то ли J, то ли Jole, а может, и ActiveJ (если честно, я просто не помню), точно такого же как Java, но другого. Это было круто, но Sun засудила Microsoft по какому-то дряхлому закону. Налицо была гнусная попытка задушить право Microsoft выпускать такие же продукты, как у других, но другие.
Помните менеджера по J/Jole/ActiveJ, стучащего по столу туфлей и говорящего, что Microsoft никогда не бросит этот продукт? Глупец! Все это означало только одно – недостаток внимания к группе ActiveX (или это был COM?). Эта невероятно жизнерадостная толпа вернулась с MTS и COM+ наперевес (может, это стоило назвать ActiveX+?). Непонятно почему к MTS не приставили «COM» или «Active» или «X» или «+» – они меня просто потрясли этим! Они также грозились добавить + ко всем модным тогда выражениям. Примерно тогда же кое-кто начал вопить про «Windows DNA» (почему не DINA) и «Windows Washboard», и вопил некоторое время, но все это почило раньше, чем все поняли, что же это такое.
Fompro.
Я зашел на сервер журнала и нашел этот материал в статье про CLR за 1-й номер этого года - http://www.optim.ru/cs/2001/1/clr/clr.asp . Однако там нет никакой ссылки на оригинал. Плюс сам перевод довольно странный. Например, MFC именуются "она", а ATL - "он". Ужас.
два, дело, люди, день, жизни, глаз, всегда, которые, аниме, человек, кот, помните, сначала, самое, людей
file.jpg 179KB1600x1200
file.jpg 21KB500x282
file.jpg 77KB604x446
file.jpg 422KB911x707
можно пасту бросить сюда?
file.jpg 50KB585x390
file.jpg 12KB160x252
file.jpg 60KB371x807
file.jpg 38KB300x400
file.jpg 352KB519x640
>>25875 Это прекрасно. Соус в студию!
file.jpg 1087KB1344x2016
>>25876
>>26120
Слёт забаненных в гугле объявляю открытым!
file.jpg 103KB802x1000
Kvadratvid tk 1 месяц назад
Отстооой. Лучше бы они сделали такие комиксы про того медведя из момента 0:39 .
file.jpg 150KB768x1024
file.jpg 40KB600x476
file.jpg 72KB640x480
file.jpg 43KB469x800
file.jpg 107KB460x326
>>31696
Отвечаю на удаленный пост.
file.jpg 52KB197x215
file.jpg 60KB604x453
file.jpg 29KB604x453
file.jpg 153KB500x457
file.jpg 59KB460x480
file.jpg 233KB1721x703
file.jpg 486KB1583x1186
>>19023
А я ищу картинки и макросы с такими попугайчиками как у тебя.
file.jpg 185KB1280x720
file.jpg 160KB1200x870
file.jpg 83KB900x596
file.jpg 22KB200x180
file.jpg 998KB1280x720
file.jpg 38KB560x373
file.jpg 278KB1100x733
file.jpg 97KB960x720
>>35712
<картинка
Майор из Хеллсинга таки выжил?
>>37456
google:/"что было при сталине"
file.jpg 449KB1000x1333
>>37789
Это такая вольная переделка на тему батиного супа?
>>31690
И его мечта исполнилась!
file.jpg 1076KB2976x2122
file.jpg 438KB1280x900
Дайте пожалуйста пасту как научиться рисовать
В вычислении , DLL ад термин для осложнений , которые возникают , когда один работает с динамически подключаемых библиотек (DLL) , используемых с Microsoft Windows операционных систем , в частности , унаследованных 16-разрядных версий , которые все работают в одном пространстве памяти.
DLL Hell может проявляться по-разному, при этом приложения не запускаются и не работают правильно.
DLL Hell - это специфическая для экосистемы Windows форма ада общих концепций .
СОДЕРЖАНИЕ
Проблемы
DLL - это реализация разделяемых библиотек Microsoft . Общие библиотеки позволяют объединить общий код в оболочку, DLL, и использовать его любым прикладным программным обеспечением в системе без загрузки нескольких копий в память. Простым примером может служить текстовый редактор графического интерфейса пользователя , который широко используется во многих программах. Поместив этот код в DLL, все приложения в системе могут использовать его без использования дополнительной памяти. Это контрастирует со статическими библиотеками , которые функционально похожи, но копируют код непосредственно в приложение. В этом случае каждое приложение увеличивается на размер всех используемых им библиотек, а для современных программ он может быть довольно большим.
Проблема возникает, когда версия библиотеки DLL на компьютере отличается от версии, которая использовалась при создании программы. Библиотеки DLL не имеют встроенного механизма обратной совместимости, и даже незначительные изменения в DLL могут сделать ее внутреннюю структуру настолько отличной от предыдущих версий, что попытка их использования обычно приводит к сбою приложения. Статические библиотеки позволяют избежать этой проблемы, потому что версия, которая использовалась для сборки приложения, включена в нее, поэтому даже если более новая версия существует в другом месте в системе, это не влияет на приложение.
Основной причиной несовместимости версий является структура файла DLL. Файл содержит каталог отдельных методов (процедур, подпрограмм и т. Д.), Содержащихся в DLL, и типов данных, которые они принимают и возвращают. Даже незначительные изменения в коде DLL могут привести к переупорядочению этого каталога, и в этом случае приложение, которое вызывает определенный метод, полагая, что это 4-й элемент в каталоге, может в конечном итоге вызвать совершенно другую и несовместимую процедуру, которая будет обычно вызывает сбой приложения.
Существует несколько проблем, с которыми обычно сталкиваются библиотеки DLL, особенно после того, как в системе были установлены и удалены многочисленные приложения. Сложности включают конфликты между версиями DLL, трудности с получением необходимых DLL и наличие множества ненужных копий DLL.
Несовместимые версии
DLL топает
Распространенная и неприятная проблема возникает, когда недавно установленная программа перезаписывает рабочую системную DLL более ранней несовместимой версией. Ранние примеры этого были ctl3d.dll и ctl3dv2.dll библиотеки для Windows 3.1 : Microsoft-созданные библиотеки, сторонние издатели распространять с их программным обеспечением, но каждый раздаточный версию они разработали с , а не самой последней версии. Вытеснение DLL происходит по следующим причинам:
- В прошлом Microsoft распределяла библиотеки времени выполнения как общие системные компоненты (первоначально C: \ WINDOWS и C: \ WINDOWS \ SYSTEM) как способ эффективного совместного использования кода в ОС с общей памятью с ограниченным объемом оперативной памяти и дискового пространства. Следовательно, сторонние разработчики также распространяли их таким образом.
- Установщики приложений обычно выполняются в привилегированном контексте безопасности, который имеет доступ для установки библиотек DLL в системные каталоги и для редактирования системного реестра для регистрации новых библиотек DLL как объектов COM . Поэтому плохо написанный или неправильно настроенный установщик может понизить версию системной библиотеки в устаревших версиях Windows, в которых защита файловWindows или защита ресурсов Windows не откатывают изменение. В Windows Vista и более поздних версиях только учетная запись «доверенного установщика» может вносить изменения в основные библиотеки операционной системы.
- Приложениям Windows было разрешено включать обновления ОС в свои собственные программы установки. То есть многие библиотеки DLL Microsoft являются распространяемыми , что означает, что приложения могут включать их, если им нужны службы конкретных библиотек.
- До установщика Windows установщики Windows исторически были коммерческими продуктами; многие люди пытались написать свои собственные установщики, не обращая внимания на проблемы с версией или неправильно решая их в процессе.
- Некоторые среды разработки не добавляли автоматически ресурс версии в свои скомпилированные библиотеки, поэтому многие разработчики упустили этот аспект. Проверка дат файлов, перезапись существующих файлов или пропуск операции копирования, если DLL уже была установлена, были единственными доступными вариантами вместо правильного управления версиями.
- Иногда сама ОС удаляла или заменяла библиотеки DLL более старыми или устаревшими версиями. Например, Windows 2000 установит библиотеки DLL черно-белого принтера поверх DLL с поддержкой цвета, если после цветного принтера был установлен черно-белый принтер.
Неправильная регистрация COM
Общие модули в памяти
16-разрядные версии Windows (и Windows в Windows ) загружают только один экземпляр любой данной DLL; все приложения ссылаются на одну и ту же копию в памяти, пока никакие приложения не используют ее, и она не выгружается из памяти. (Для 32-разрядных и 64-разрядных версий Windows совместное использование между процессами происходит только тогда, когда разные исполняемые файлы загружают модуль из одного и того же каталога; код, но не стек , совместно используется процессами через процесс, называемый «отображение памяти». Таким образом, даже если желаемая DLL находится в каталоге, где можно ожидать, что она будет найдена, например, в системном каталоге или каталоге приложения, ни один из этих экземпляров не будет использоваться, если другое приложение было запущено с несовместимой версией из третий каталог. Эта проблема может проявляться как ошибка 16-разрядного приложения, которая возникает только при запуске приложений в определенном порядке.
Отсутствие работоспособности
В прямом конфликте с проблемой выталкивания DLL: если обновления библиотеки DLL не влияют на все приложения, которые ее используют, то становится намного сложнее "обслуживать" DLL, то есть устранять проблемы, существующие в текущих версиях DLL. . (Исправления безопасности - особенно убедительный и болезненный случай.) Вместо исправления только последней версии DLL разработчик в идеале должен внести свои исправления и протестировать их на совместимость с каждой выпущенной версией DLL.
Причины
Несовместимость DLL была вызвана:
- Ограничения памяти в сочетании с отсутствием разделения пространства памяти процесса в 16-битных версиях Windows;
- Отсутствие принудительных стандартных схем управления версиями, именами и расположением файловой системы для библиотек DLL;
- Отсутствие принудительного стандартного метода установки и удаления программного обеспечения ( управление пакетами );
- Отсутствие централизованной авторитетной поддержки управления двоичным интерфейсом приложения DLL и средств защиты, что позволяет выпускать несовместимые библиотеки DLL с тем же именем файла и внутренними номерами версий;
- Упрощенные инструменты управления, предотвращающие идентификацию измененных или проблемных DLL пользователями и администраторами;
- Разработчики нарушают обратную совместимость функций в разделяемых модулях;
- Microsoft выпускает внеполосные обновления для компонентов среды выполнения операционной системы;
- Неспособность более ранних версий Windows запускать параллельно конфликтующие версии одной и той же библиотеки;
- Использование текущего каталога или %PATH% переменной среды, которые меняются со временем и от системы к системе, для поиска зависимых библиотек DLL (вместо загрузки их из явно настроенного каталога);
- Разработчики повторно используют идентификаторы ClassID из примеров приложений для COM-интерфейсов своих приложений, вместо того, чтобы создавать свои собственные новые идентификаторы GUID .
DLL Hell был очень распространенным явлением в версиях операционных систем Microsoft до Windows NT, основная причина заключалась в том, что 16-разрядные операционные системы не ограничивали процессы своим собственным пространством памяти, тем самым не позволяя им загружать свою собственную версию общий модуль, с которым они были совместимы. Ожидалось, что установщики приложений будут хорошими гражданами и проверят информацию о версии DLL перед перезаписью существующих системных DLL. Стандартные инструменты для упрощения развертывания приложений (которые всегда включают доставку зависимых библиотек DLL операционной системы) были предоставлены Microsoft и другими сторонними поставщиками инструментов. Microsoft даже потребовала, чтобы поставщики приложений использовали стандартный установщик и чтобы их программа установки была сертифицирована для правильной работы, прежде чем им будет разрешено использовать логотип Microsoft. Подход «добросовестного установщика» не смягчил проблему, поскольку рост популярности Интернета предоставил больше возможностей для получения несовместимых приложений.
Использование вредоносным ПО
Неопределенность, с которой не полностью квалифицированные библиотеки DLL могут быть загружены в операционную систему Windows, в последние годы использовалась вредоносными программами , открывая новый класс уязвимостей, который затрагивает приложения от многих различных поставщиков программного обеспечения, а также саму Windows.
Решения
Различные формы DLL-ада были решены или смягчены на протяжении многих лет.
Статическое связывание
Простым решением проблемы DLL Hell в приложении является статическое связывание всех библиотек, то есть включение требуемой версии библиотеки в программу, вместо того, чтобы выбирать системную библиотеку с указанным именем. Это распространено в приложениях C / C ++, где вместо того, чтобы беспокоиться о том, какая версия MFC42.DLL установлена, приложение компилируется для статической компоновки с теми же библиотеками. Это полностью исключает библиотеки DLL и возможно в автономных приложениях, использующих только библиотеки, которые предлагают статический вариант, как это делает библиотека Microsoft Foundation Class . Однако основная цель DLL - совместное использование библиотек времени выполнения между программами для уменьшения накладных расходов памяти - принесена в жертву; дублирование кода библиотеки в нескольких программах приводит к раздуванию программного обеспечения и усложняет развертывание исправлений безопасности или новых версий зависимого программного обеспечения.
Защита файлов Windows
Проблема перезаписи DLL (называемая Microsoft DLL Stomping ) была несколько уменьшена с помощью Windows File Protection (WFP), которая была представлена в Windows 2000 . Это предотвращает перезапись системных библиотек DLL неавторизованными приложениями, если они не используют определенные API Windows, которые это разрешают. По-прежнему может существовать риск того, что обновления от Microsoft несовместимы с существующими приложениями, но этот риск обычно снижается в текущих версиях Windows за счет использования параллельных сборок .
Сторонние приложения не могут обрабатывать файлы ОС, если они не связывают законные обновления Windows со своим установщиком или если они не отключают службу защиты файлов Windows во время установки, а в Windows Vista или более поздних версиях также приобретают права собственности на системные файлы и предоставляют себе доступ. SFC утилита может восстановить эти изменения в любое время.
Одновременный запуск конфликтующих DLL
Решения здесь состоят в наличии разных копий одних и тех же библиотек DLL для каждого приложения как на диске, так и в памяти.
Простым ручным решением конфликтов было размещение различных версий проблемной DLL в папки приложений, а не в общую общесистемную папку. В целом это работает, если приложение является 32-разрядным или 64-разрядным и DLL не использует разделяемую память. В случае 16-разрядных приложений два приложения не могут выполняться одновременно на 16-разрядной платформе или на одной и той же 16-разрядной виртуальной машине в 32-разрядной операционной системе. OLE предотвращало это до Windows 98 SE / 2000, потому что более ранние версии Windows имели единый реестр COM-объектов для всех приложений.
Windows 98 SE / 2000 представила решение, называемое параллельной сборкой , которое загружает отдельные копии DLL для каждого приложения, которому они требуются (и, таким образом, позволяет приложениям, требующим конфликтующих DLL, работать одновременно). Этот подход устраняет конфликты, позволяя приложениям загружать уникальные версии модуля в свое адресное пространство, сохраняя при этом основное преимущество совместного использования библиотек DLL между приложениями (т. Е. Сокращение использования памяти) за счет использования методов сопоставления памяти для совместного использования общего кода между различными процессами, которые все еще работают. используйте тот же модуль. Однако библиотеки DLL, использующие общие данные между несколькими процессами, не могут использовать этот подход. Одним из отрицательных побочных эффектов является то, что потерянные экземпляры DLL могут не обновляться во время автоматизированных процессов.
Портативные приложения
В зависимости от архитектуры приложения и среды выполнения переносимые приложения могут быть эффективным способом уменьшить некоторые проблемы с DLL, поскольку каждая программа связывает свои собственные частные копии любых требуемых DLL. Механизм основан на том, что приложения не полностью определяют пути к зависимым библиотекам DLL при их загрузке, а операционная система выполняет поиск в каталоге исполняемых файлов до любого общего расположения. Однако этот метод также может использоваться вредоносными программами, и повышенная гибкость также может быть достигнута за счет безопасности, если частные библиотеки DLL не обновляются с помощью исправлений безопасности так же, как общие.
Виртуализация приложений также может позволить приложениям работать в «пузыре», что позволяет избежать установки файлов DLL непосредственно в операционную систему.
Другие меры противодействия
Есть и другие меры противодействия DLL Hell, некоторые из которых, возможно, придется использовать одновременно; некоторые другие функции, которые помогают смягчить проблему:
Различные ошибки, связанные с библиотекой hal.dll, встречаются практически во всех версиях Windows: Windows XP, Windows Vista, Windows 7 и Windows 8. Текст самой ошибки может отличаться: «отсутствует hal.dll», «Запуск Windows невозможен, файл hal.dll отсутствует или поврежден», «Не найден файл \Windows\System32\hal.dll — наиболее распространенные варианты, но случаются и другие. Ошибки с файлом hal.dll всегда появляются непосредственно перед полной загрузкой Windows.
Ошибка hal.dll в Windows 7 и Windows 8
Причина ошибки — та или иная проблема с файлом hal.dll, однако не стоит спешить искать «скачать hal.dll» в Интернете и пытаться установить этот файл в систему — скорее, всего, это не приведет к желаемому результату. Да, один из вариантов возникновения проблемы — удаление или повреждение этого файла, а также повреждение жесткого диска компьютера. Однако, в подавляющем большинстве случаев, ошибки hal.dll в Windows 8 и Windows 7 возникают из-за проблем с главной загрузочной записью (MBR) системного жесткого диска.
- Если проблема появилась один раз, попробуйте просто перезагрузить компьютер — скорее всего, это не поможет, но попробовать стоит.
- Проверьте порядок загрузки в BIOS. Убедитесь, что в качестве первого устройства для загрузки установлен жесткий диск с установленной операционной системой. Если непосредственно перед появлением ошибки hal.dll Вы подключали флешки, жесткие диски, делали изменения настроек BIOS или перепрошивку BIOS, обязательно выполните этот пункт.
- Выполните исправление загрузки Windows с помощью установочного диска или загрузочной флешки Windows 7 или Windows 8. Если проблема вызвана именно повреждением или удалением файла hal.dll, этот способ с большой вероятностью Вам поможет.
- Исправьте загрузочную область жесткого диска. Для этого нужно сделать все те же действия, что и для исправления ошибки BOOTMGR IS MISSING, о чем подробно написано здесь. Это наиболее часто встречающийся вариант в Windows 7 и Windows 8.
- Ничего не помогло — попробуйте установить Windows (воспользовавшись «чистой установкой».
Стоит отметить, что последний вариант, а именно переустановка Windows (с флешки или диска), исправит любые программные ошибки, но не аппаратные. Так что, если несмотря на то, что Вы заново установили Windows ошибка hal.dll остается, стоит поискать причину в аппаратной части компьютера — в первую очередь, в жестком диске.
Теперь поговорим о способах исправления ошибки, если на Вашем компьютере установлен Windows XP. В данном случае эти способы будут несколько отличаться (под каждым отдельным номером — отдельный способ. Если он не помог, можно переходить к следующему):
Вот и все советы по исправлению данной ошибки. Следует отметить, что в рамках этой инструкции я не могу подробно описать некоторые пункты, например номер 5 в части про Windows XP, тем не менее, где искать решение обрисовал достаточно подробно. Надеюсь, руководство окажется полезным для Вас.
Читайте также: