Адски библиотеки (известен още като DLL Hell)

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

Работи добре на моите тестови машини, но на компютъра на клиентите ми не успя да се инициализира със съобщение за грешка като „Не може да се намери входна точка _somefunction@4AKKZ в TMYlibrary.dll“.

След известно проучване с монитора на процесите на sysinternal разбрах, че Windows първо ще търси DLL файлове в windows/sytem32, така че ако DLL с име, подобно на my DLL, присъства в system32, Windows ще избере това и ще опита за да намеря моите входни точки за функция в него - което ще се провали.

Знаете ли за възможност за промяна на поведението при търсене в DLL на windows?


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

  • [Актуализация] Файлът .exe се намира на най-горното ниво на дървовидната структура на папките на приложението.
  • Wrapper и DLL-ите на трети страни се намират в подпапката /bin на папката с моите приложения
  • Dev платформата е Windows XP/7, използвайки VS2008 за dll и 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
някой може просто да потърси в Google и да удари този SO въпрос. Което е полезно. Така че си струва да зададете и отговорите на собствения си въпрос. - 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