ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Перенаправление DLL

Начало тут:
1. динамически подключаемые библиотеки;
2. о динамически подключаемых библиотеках подробнее;
3. преимущества динамического связывания;
4. создание динамически подключаемой библиотеки;
5. функция точки входа DLL;
6. динамическое связывание во время запуска;
7. динамическое связывание во время выполнения;
8. порядок поиска DLL;
9. данные библиотеки DLL.

Перевод с английского статьи от 31.05.2018 г. «Dynamic-Link Library Redirection»:
https://docs.microsoft.com/ru-ru/windows/win32/dlls/dynamic-link-library-redirection
(На данный момент на этом сайте нет перевода этой статьи на русский, есть только версия на английском.)

Приложения могут зависеть от какой-то конкретной версии совместно используемой [несколькими разными приложениями] DLL и могут перестать работать после установки другого приложения с более новой или более старой версией той же самой DLL. Есть два способа гарантировать, что ваше приложение будет использовать DLL нужной версии: перенаправление [поиска] DLL и компоненты, умеющие работать рядом с другими версиями той же компоненты [side-by-side components]. Разработчики и администраторы должны использовать перенаправление DLL для уже находящихся в работе приложений потому, что этот способ не требует внесения каких-либо изменений в приложение. Если же вы создаете новое приложение или дорабатываете приложение и хотите изолировать [избавить] ваше приложение от потенциальных проблем, создавайте компонент, умеющий работать рядом с другими.

Чтобы включить возможность перенаправления DLL для всех пользователей данного компьютера [machine-wide], вы должны создать новый ключ реестра. Создайте новый ключ типа DWORD с названием DevOverrideEnable в ветке реестра HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options [аббревиатура HKLM означает «HKEY_LOCAL_MACHINE»] и присвойте этому ключу значение 1. После этого вы должны перезапустить ваш компьютер для того, чтобы добавленный ключ начал работать.

Чтобы использовать перенаправление DLL, создайте файл перенаправления для вашего приложения. Файл перенаправления должен иметь название, составленное следующим образом: Название_приложения.local. Например, если названием [исполняемого файла] приложения является Editor.exe, то файл перенаправления должен называться Editor.exe.local. Вы должны поместить этот файл .local в каталог приложения. Также вы должны поместить в этот же каталог приложения нужные библиотеки DLL.

Содержимое файла перенаправления игнорируется, но само его наличие становится причиной того, что операционная система Windows будет проверять [при поиске DLL] каталог приложения в первую очередь всякий раз, когда это приложение пытается загрузить DLL, несмотря на путь к этой DLL, указанный при вызове функции LoadLibrary или LoadLibraryEx. Если нужная DLL не будет найдена в каталоге приложения, то тогда эти функции используют их обычный порядок поиска DLL. Например, если приложение c:\myapp\myapp.exe вызывает функцию LoadLibrary, задав в ее параметре следующий путь:

c:\program files\common files\system\mydll.dll

И если существуют файл перенаправления c:\myapp\myapp.exe.local и файл библиотеки c:\myapp\mydll.dll, то функция LoadLibrary загрузит библиотеку c:\myapp\mydll.dll. В противном случае функция LoadLibrary загрузит файл библиотеки c:\program files\common files\system\mydll.dll.

В качестве альтернативы [вышеописанному способу перенаправления DLL]: если существует каталог с названием c:\myapp\myapp.exe.local и этот каталог содержит файл библиотеки mydll.dll, то функция LoadLibrary загрузит библиотеку c:\myapp\myapp.exe.local\mydll.dll.

Если у приложения имеется манифест, то любые файлы .local игнорируются.

Если вы используете перенаправление DLL и приложение не имеет доступа ко всем дискам и каталогам, попавшим в поисковый список каталогов при поиске DLL, то функция LoadLibrary остановит процесс поиска сразу же, как только наткнется на отказ в доступе. (Если вы не используете перенаправление DLL, функция LoadLibrary пропустит каталоги, к которым она не имеет доступа, и затем продолжит поиск.)

Хорошей практикой является помещать библиотеки DLL приложения в тот же каталог, в котором размещено это приложение, даже если вы не собираетесь использовать перенаправление DLL. Такой подход гарантирует, что устанавливаемое приложение не затрёт своими DLL чужие и не вызовет тем самым сбои в работе других приложений. К тому же, если вы последуете этой хорошей практике, то другие приложения тоже не затрут ваши DLL своими и не послужат причиной сбоев в вашем приложении.
Tags: Английский язык, Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments