Перепризначення бібліотеки, що динамічно підключається (DLL)

Перезначення бібліотеки, що динамічно підключається (DLL)

Прикладні програми можуть залежати від конкретної версії спільно використовуваноїDLLі запуск завершується помилкою, якщо інша програма встановлюється з більш новою або застарілою версією однієї і тієї жDLL. Є два способи гарантувати, щоб ваша програма використовувала коректнуDLL: перепризначенняDLLта паралельні компоненти. Розробники та адміністратори повинні використовувати перепризначенняDLLдля існуючих програм, тому що це не вимагає будь-яких змін у прикладній програмі. Якщо Ви створюєте нову програму або модифікуєте її і хочете ізолювати свою програму від можливих проблем, створюється паралельний компонент .

Щоб використовувати перепризначенняDLL, створіть для своєї програмифайл переназначення (redirection file). Файл перепризначення повинен бути названий нижче:App_name.local. Наприклад, якщо ім'я програмиEditor.exe, файл перепризначення має бути названийEditor.exe.local. Ви повинні встановити.localфайл до каталогу прикладної програми. Ви також повинні встановити ціDLLв каталог програми.

Зміст файлу перепризначення ігнорується, але його присутність змушуєWindowsперевіряти каталог програми щоразу, коли система завантажуєDLL, незалежно від шляху, заданого вLoadLibraryабоLoadLibraryEx. Якщо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.

Як альтернатива, якщо каталог званийc:\myapp\myapp.exe.localіснує і міститьmydll.dll, функціяLoadLibraryзавантажуєc: \myapp\myapp.exe.local\mydll.dll.

ВідоміDLLне можуть бути перепризначені. Список відомихDLLдивись у наступному ключі реєстру:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.

Система використовує утилітуWindowsFileProtection(захист файлівWindows), щоб гарантувати, що системніDLL, такі як ці, не будуть оновлюватися або видалятися, за винятком випадків оновлення операційної системи (OS) типу сервісних пакетів (service packs).

Windows 2000:ВідоміDLLв ційОСможуть бути перепризначені.

Якщо програма має маніфест, то будь-які.localфайли ігноруються.

Windows 2000:Маніфести не впливають на перепризначенняDLL.

  • Якщо Ви використовуєте перепризначенняDLL, а програма пошуку не має доступу до всіх дисків і каталогів,LoadLibraryприпиняє пошук, як тільки доступ відхиляється.
  • Якщо ви не використовуєте перепризначенняDLL,LoadLibraryпропускає каталоги, до яких вона не може отримати доступ, а потім продовжує пошук.

Хорошою практикою є те, щоб встановлюватиDLLпрограми в тому самому каталозі, який містить прикладну програму, навіть якщо Ви не використовуєте перепризначенняDLL. Це гарантує, що інсталяція програми не записує поверх інших копійDLLі змушує інші прикладні програми завершуватися помилкою. Також, якщо Ви дотримуєтеся цієї гарної практики, інші програми не записують поверх вашої копіїDLLі змушують вашу програму завершитися помилкою.