Добрый день!Я только что столкнулся с очень сложной проблемой, которую с трудом могу объяснить и решить.
У меня есть библиотека dll, скомпилированная в VC 2017. Эта библиотека по сути является модулем python: для создания интерфейсов использовалась оболочка SWIG.Таким образом, в данной папке у меня есть следующие файлы:
- python.exe
- python27.dll
- TestLib.dll
- TestLib.pyd
- test_lib.py
- load.py
Файл test_lib.py - это интерфейс, созданный SWIG.
Мой "load.py"скрипт:
from test_lib import *
Команда, которую я выполняю в оболочке:
python.exe load.py
Тесты
Если я запускаю эту команду в cmd.exe как обычный пользователь,Я получаю следующую ошибку:
Traceback (most recent call last):
File "load.py", line 1, in <module>
from test_lib import *
File "test_lib.py", line 28, in <module>
TestLib = swig_import_helper()
File "test_lib.py", line 24, in swig_import_helper
_mod = imp.load_module('TestLib', fp, pathname, description)
ImportError: DLL load failed: The specified module could not be found.
Кажется, что Windows или Python не могут загрузить модуль.Я проверил с помощью Dependency Walker зависимости dll и все вроде бы нормально.
Теперь странные вещи начинаются.
Если я выполняю ту же команду в cmd.exe с правами администратора, она работает!
Если я выполняю ту же команду в Powershell, что и обычный пользователь, она снова работает!
Анализ
Я взял инструмент Process Monitor и проанализировал каждую из них.три вызова.
cmd.exe + обычный пользователь
cmd.exe + admin или powershell.exe + обычный пользователь
Да, cmd + admin и powershell + normal демонстрируют одинаковое поведение.Вы можете видеть, что во всех трех вызовах после того, как команда QueryAllInformationFile получает статус BUFFER OVERFLOW, Windows начинает поиск библиотеки в разных местах ( почему ??? ).
В последних двух вызовахпосле проверки 2 альтернативных путей ( C: \ MyCompany \ Project \ Project \ Project \ Project \ Bin \ Win32 \ TestLib.pyd и C: \ Project \ Bin \ Win32 \ TestLib.pyd), Windows возвращается в исходное местоположение C: \ MyCompany \ Project \ Project \ Project \ bin \ Win32 \ TestLib.pyd и, наконец, начинает загружать DLL.
Однакоcmd.exe с правами обычного пользователя ведет себя по-другому.Windows пробует несколько каталогов, и кажется, что в конце процесс завершается, поскольку считается, что библиотека не найдена.( почему ??? )
Наконец, если я сделаю небольшой трюк и помимо его исходного местоположения, дополнительно скопируйте мою библиотеку в C: \ MyCompany \ Project \ Project \ Project \ Project\ Bin \ Win32 \ TestLib.pyd cmd.exe с правами обычного пользователя запускается без ошибок!Это смешно.
Вопросы
Какого черта происходит с этим вызовом (cmd.exe + обычный пользователь)?
Как я могу это исправить?
Почему Windows пытается найти мою библиотеку в стольких местах, хотя она обнаруживает ее в первоначально указанном месте с самого первого шага?