Адские библиотеки (ака DLL Hell)

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

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

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

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


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

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

person sum1stolemyname    schedule 22.07.2010    source источник
comment
Где находится EXE-файл? Тоже в папке \bin?   -  person Warren P    schedule 22.07.2010


Ответы (2)


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

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

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

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

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

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

person sum1stolemyname    schedule 22.07.2010
comment
+1, потому что всегда хорошо, когда кто-то находит время, чтобы дать правильный ответ, особенно когда он был тем, кто просил об этом в первую очередь :) - person ereOn; 22.07.2010
comment
кто-то может просто погуглить и ответить на этот ТАК вопрос. Что полезно. Так что стоит задать и ответить на свой вопрос. - person Warren P; 22.07.2010
comment
@warren: Хороший вопрос. Собственно так я и познакомился с этим сайтом. - person sum1stolemyname; 22.07.2010

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

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

person Alex    schedule 22.07.2010
comment
Вот что он сделал. Вы читали вопрос? Или Он? Вопрос неоднозначный и не указывает, где находится EXE-файл. - person Warren P; 22.07.2010