Конфиденциальная информация WindowsКак избежать кошмара библиотек DLL

Рэймонд Чен (Raymond Chen)

Кошмар библиотек DLL Эта проблема настолько коварна, что даже получила собственное уничижительное прозвище. Вы устанавливаете одну программу, и неожиданно перестает работать другая программа, казалось бы, совершенно не связанная с первой. Это происходит потому, что, незаметно для вас, две программы объединены использованием одного файла библиотеки 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. Содержимое файла не имеет значения; важен сам факт существования этого файла.

После включения перенаправления для программы все попытки этой программы загрузить библиотеку DLL сначала приведут к поиску в той папке, где расположен файл программы, и лишь затем — в обычных местах. Поэтому в случае конфликта между различными файлами MSVCRT.DLL можно включить перенаправление для каждой из программ и поместить копии файлов MSVCRT.DLL для частного использования в папку установки каждой программы. После этого каждая программа будет использовать свою собственную версию библиотеки MSVCRT.DLL, а именно ту версию, с которой выполнялось тестирование программы.

Волшебство этого метода заключается еще и в том, что он работает даже тогда, когда программа использует полный путь для загрузки библиотеки DLL. Например, представим себе, что программа пытается загрузить библиотеку C:\Program Files\Common Files\Proseware Inc\taxplugin.dll. После обновления до версии Proseware 2.0 вы обнаруживаете, что подключаемые модули расчета налогов несовместимы с программой подготовки счетов. Вы можете скопировать старую версию подключаемого модуля расчета налогов в C:\Program Files\Litware Inc\taxplugin.dll. Даже несмотря на то, что при загрузке подключаемого модуля расчета налогов используется полный путь, перенаправление библиотек DLL сначала выполнит поиск в текущей папке и будет использовать локальную копию вместо копии в папке «Proseware Inc».

В операционных системах Windows XP и Windows Vista™ правила перенаправления библиотек DLL немного отличаются, но общий принцип остается тем же. Кроме создания файла с расширением «local» можно создать и папку с таким расширением. В этом случае поиск будет выполняться в папке с расширением «local», а не в папке установки программы. Это позволяет использовать перенаправление для нескольких программ в одной папке, не создавая конфликтов.

Следует учесть, что нельзя использовать перенаправление для программ, содержащих манифест приложения, а также для так называемых «известных» библиотек DLL. (Дальнейшие сведения см. на странице «Dynamic-Link Library Redirection» (на английском языке).

Перенаправление библиотек DLL не позволит полностью избежать кошмара библиотек DLL, но, по крайней мере, оно предоставляет средства первой помощи для контроля над ситуацией на время решения проблемы.

Рис. 1.

Рис. 1.   

Рэймонд Чен (Raymond Chen) автор материалов по истории Windows и программированию в среде Win32 на собственном веб-узле The Old New Thing («Хорошо забытое старое») и новой книги, также озаглавленной «The Old New Thing» (издательство Addison-Wesley, 2007 г.). Однако у автора нет домашней кошки по кличке «The Old New Thing».

© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.