Файл DLL, загруженный дважды перенаправлением DLL через декларацию

Я включаю python.h в моем Visual C++ проект файла DLL, который вызывает неявное соединение с python25.dll. Однако я хочу загрузить определенное python25.dll (несколько могут присутствовать на компьютере), таким образом, я создал очень простой файл манифеста, названный test.manifest:



    

И я объединяю его с автоматически встроенным файлом манифеста, сгенерированным Visual Studio благодаря:

Configuration Properties -> Manifest Tool -> Input and Output -> Additional Manifest Files
-->$(ProjectDir)\src\test.manifest

python25.dll теперь загружается дважды: тот, который требует декларация и та, которую Windows должен найти через его поисковый порядок.

Снимок экрана проводника процесса http://dl.dropbox.com/u/3545118/python25_dll.png

Почему это происходит и как я могу просто загрузить файл DLL, на который указывает декларация?

8
задан Peter Mortensen 1 October 2013 в 10:29
поделиться

2 ответа

Я добился некоторого прогресса в понимании вопроса.

Сначала позвольте мне уточнить сценарий:

  • Я создаю файл DLL, который встраивает, и расширяет Python, используя Python C API и Boost.python.
  • Таким образом, я предоставляю Python25.dll в той же папке, что и мой файл DLL, а также Boost_Python-VC90-MT-1_39.DLL .
  • Тогда у меня есть файл EXE, который представляет собой демо, чтобы показать, как ссылаться на мой файл DLL: этот файл EXE не должен быть в той же папке, что и мой файл DLL, до тех пор, пока файл DLL можно найти В пути (я предполагаю, что конечный пользователь может или не может поместить его в одну и ту же папку).

Затем при запуске файла EXE текущий каталог не является ни одним, содержащим Python25.dll , и именно поэтому порядок поиска используется и некоторые другие Python25.dll быть найденным до моего.

Теперь я выяснил, что метод манифеста был хорошим подходом: мне удалось перенаправить нагрузку на «мою» Python25.dll .

Проблема в том, что это усиление BOOST DLL BOOST_PYTHON-VC90-MT-1_39.DLL , отвечающих за «двойную» загрузку!

Если я не загружу этому, то Python25.dll правильно перенаправлен. Теперь я как-то должен выяснить, как сказать Boost DLL-файл не загружать другого Python25.dll ...

2
ответ дан 5 December 2019 в 17:37
поделиться

Зависимость Уолкер обычно является лучшим инструментом для разрешения этой проблемы. Я не слишком уверен, насколько хорошо он обрабатывает манифель, хотя ...

Где в этом запутанном беспорядке находится фактический файл исполняемого процесса?

Две возможности приходят на ум:

  1. Вы пишете файл DLL Python Отказ Таким образом, процесс Python загружает ваш файл DLL, и его будет , уже есть собственная зависимость Python25.dll.

  2. Файл EXE загрузка файла DLL встроен с файлами заголовков и библиотеками, предоставленными файловым проектом DLL. Так что он наследует комментарий #pragma (lib, "python25.lib") из файла заголовка и в результате загружается сам файл DLL.

Моя проблема со вторым сценарием, я ожидаю, что файл EXE и файл DLL, чтобы быть в той же папке в том случае, если файл EXE неявно загружает ваш файл DLL. В этом случае файл EXE, ваш файл DLL и Python25.dll уже входит в той же папке. Почему тогда версия System32 когда-либо загружается? Порядок поиска для неявно загруженных файлов DLL всегда находится в папке файла приложения EXE.

Таким образом, фактический интересный вопрос неявным в вашем запросе: как система System32 Python26.dll вообще загружен?

1
ответ дан 5 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: