Адские библиотеки (ака DLL Hell) - PullRequest
4 голосов
/ 22 июля 2010

В моем проекте я использую приложение Delphi, которое динамически загружает DLL-оболочку (экспорт функций C-Style), которая, в свою очередь, статически связывается с кучей сторонних DLL.

Работает нормальнона моих тестовых компьютерах, но на моем клиентском компьютере он не смог инициализироваться сообщением об ошибке типа «Не удалось найти точку входа _somefunction @ 4AKKZ в TMYlibrary.dll».

После некоторого исследования с помощью монитора процессов sysinternal я понялчто Windows будет сначала искать DLL-библиотеки fror в windows / sytem32, поэтому, если в system32 присутствует DLL-библиотека с именем, похожим на my DLL, Windows выберет эту и попытается найти в ней точки входа моей функции - чтосбой.

Знаете ли вы о возможности изменить DLL-библиотеку Windows при поиске?


Дополнительная информация

  • [ Обновление ] .exe-файл находится на верхнем уровне дерева папок приложения.
  • Оболочка и сторонние библиотеки DLLоба находятся в подпапке / корзине моих приложений. Папка
  • Платформа Dev - это Windows XP / 7, использующая VS2008 для dlll и Delphi 2010 для приложения

Ответы [ 2 ]

13 голосов
/ 22 июля 2010

Я сам нашел другое решение:

SetDllDirectory добавляет дополнительный путь поиска в список местоположений для просмотра.

С http://msdn.microsoft.com/en-us/library/ms686203%28v=VS.85%29.aspx

После вызова SetDllDirectory путь поиска DLL:

  1. Каталог, из которого загружено приложение.
  2. Каталог, указанный параметром lpPathName.
  3. Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу. Имя этот каталог - System32.
  4. 16-битный системный каталог. Там нет функции, которая получает путь к этому каталогу, но это поиск. Название этого каталога Системный.
  5. Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
  6. Каталоги, перечисленные в переменной среды PATH.

(может быть, я должен заняться поиском в Google, прежде чем отправлять сообщения на SO;)

1 голос
/ 22 июля 2010

Поставьте DLL в папку вашей программы. (аналогично exe-файлу).

Тогда Windows сначала должна попробовать вашу версию.

...