DLL не загружена из документированного пути поиска - PullRequest
3 голосов
/ 01 июля 2011

У меня есть процесс, который загружает DLL из места, не указанного в задокументированном порядке поиска (документы, ссылки на которые приведены ниже). Я хочу знать, почему.

Вот описание моей установки:

  1. У меня есть папка 'c: \ foo', содержащая a.dll и b.dll.
  2. У меня есть скрипт на python, который также хранится в c: \ foo.
  3. Скрипт Python выполняет LoadLibrary ('c: /foo/a.dll') (через ctypes)
  4. a.dll связан с библиотекой импорта для b.dll (т. Е. Используется неявное связывание).
  5. Я запускаю скрипт python с текущим каталогом, скажем, c :. Это может быть что угодно.
  6. b.dll загружается из c: \ foo, хотя его нет в пути поиска.
  7. Глядя на трассировку монитора процессов, я вижу, что сначала были опробованы все документированные пути поиска, и все они оказались неудачными. Затем процесс python попытался и не смог открыть «C: \ WINDOWS \ assembly \ GAC \ Microsoft.VC80.CRT.mui \ 8.0.50727.4053_en-US_1fc8b3b9a1e18e3b \ Microsoft.VC80.CRT.mui.DLL», , затем он открыл c: \ foo \ b.dll.

Итак, похоже, что в каталоге a.dll ищется b.dll, хотя в документах об этом не говорится. Кроме того, это происходит после просмотра системного пути, который является безумным. Кто-нибудь может пролить свет на это?

То же самое происходит со скриптом MatLab, который также использует ..dll.

Я использую Windows XP SP 3.

В этой статье MSDN объясняется порядок поиска по умолчанию. Я цитирую:

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

1 Ответ

0 голосов
/ 10 июля 2011

a.dll, вероятно, использует динамическое связывание во время выполнения в качестве крайней меры http://msdn.microsoft.com/en-us/library/ms686944%28VS.85%29.aspx

...