2009-02-05 7 views
8

MSDN говорит, что функция SetDllDirectory() может быть использована для вставки каталога в DLL Search Path. Можно ли получить доступ к этой функции из командного файла или скрипта cmd, возможно, используя cscript?Можно ли добавить каталог в путь поиска DLL из командного файла или скрипта cmd?

Цель состоит в том, чтобы наша версия разработки dll была найдена до ранее существовавшей старой версии в% WINDIR% и т. Д., Без необходимости писать программу только для этого.

Заранее благодарим за ваше время и мысли.

ответ

6

Вы можете разместить DLL по тому же пути, что и исполняемый файл, поиск которого выполняется до% WINDIR%. Невозможно напрямую вызвать SetDllDirectory из пакетного файла.

Но вы можете вставить свой каталог DLL в переменную% PATH%, а Windows найдет там DLL.

set PATH=C:\path to your dll;%PATH% 
10

Цель состоит в том, чтобы иметь нашу версию DLL найденного до развития ранее существовавших старше один в% WINDIR% и т.д., без необходимости писать программу только для этого.

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

Вы можете сделать это с помощью следующей партии команды:

set PATH=c:\MyDLLFolder;%PATH% 

Если путь содержит пробелы, необходимо использовать следующий пакетный команду:

set PATH="C:\My DLL Folder";%PATH% 

Но помните, что это изменение путь только сделанный в PATH текущего сеанса консоли. Если вы закроете и снова откроете консоль, эти изменения пути будут потеряны.

+0

Это подскакивает шаги в середине. После поиска 1) каталога, в котором находится вызывающий .exe, Windows ищет 2) системный каталог, 3) 16-битный системный каталог, 4) каталог Windows, 5) текущий каталог, 6) и NOW, наконец, ищет% path%. См. Путь/ссылку поиска DLL в вопросе. –

+0

Вы отвечаете правильно в отношении пути поиска EXE, BAT, COM, хотя (насколько мне известно). –

+0

Мэтт, поэтому я получил свой комментарий с помощью «Если DLL не находится в той же папке, что и исполняемый файл». Что касается людей, которые настолько глупы, что помещают их несистемные dll в системные папки, тогда им повезет;) – jussij

3

Чтобы прояснить спор о порядке поиска DLL (в комментариях на @ jussij Ответим), вот список, составленный из дока Microsoft:

Если SafeDllSearchMode включен, порядок поиска выглядит следующим образом:

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

Если SafeDllSearchMode отключен, порядок поиска выглядит следующим образом:

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

См http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx#standard_search_order_for_desktop_applications