Windows: Изменение порядка поиска DLL для Exe - PullRequest
4 голосов
/ 23 октября 2009

У меня есть C ++ Exe в каталоге приложения, который содержит используемые им библиотеки DLL. Теперь для целей тестирования мне нужно изменить существующую DLL и использовать ее вместо оригинальной. Но чтобы не изменять существующую установку, я не могу сделать резервную копию существующей DLL и заменить ее на измененную или перенести существующую в другое место. Я также не могу изменить Exe. 2 DLL должны существовать бок о бок. Единственное изменение должно заключаться в том, что Exe должен прозрачно загружать измененную DLL, которая находится в некоторой другой папке, а не существующую DLL, которая находится в той же папке, что и Exe. Есть ли какой-нибудь элегантный способ сделать это?

Я просмотрел некоторые статьи MSDN, но не смог найти способ сделать это. Решение должно работать на Windows XP и выше.

Ответы [ 4 ]

2 голосов
/ 26 октября 2009

Windows будет загружать не более одной версии каждого имени DLL на процесс. Если он загружает DLL, указанную в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs, он не будет загружать DLL с аналогичным именем позже. Но в AppInit_DLLs вы можете перечислить DLL с явным путем, переопределяя обычный порядок LoadLibrary ().

Следовательно, временно поместите вашу тестовую DLL в AppInit_DLLs, и она переопределит любую другую DLL с таким же именем.

1 голос
/ 23 октября 2009

Согласно MSDN , он всегда будет запускаться из каталога приложения (если вы не измените его с помощью альтернативного порядка поиска ...), поэтому это кажется трудным. Вы все еще можете скопировать исполняемый файл и другие его зависимости в другом месте. Это не так уж и элегантно.

Или вы можете запустить исполняемый файл, который вы скопировали в другом месте вместе с новой DLL, из исходного каталога. В соответствии с порядком поиска это тоже должно работать, хотя должен признать, что никогда не пытался.

0 голосов
/ 25 октября 2009

Вы можете перехватить вызовы LoadLibrary () для вашего процесса с самого начала. Когда ваша исправленная версия LoadLibrary () видит ваши DLL, она вызывает оригинальный LoadLibrary () с измененным путем DLL. Даже если вы не используете LoadLibrary () для загрузки ваших DLL, Windows CRT делает. Так что эта техника должна работать.

0 голосов
/ 23 октября 2009

Единственный известный мне способ - использовать LoadLibrary API, включая путь, но вы говорите, что не можете изменить exe.

...