Можем ли мы иметь 2 DLL с одинаковым именем, загружаемых в один процесс - PullRequest
7 голосов
/ 27 августа 2009

Я имею в виду win32 dll, эти простые pe-файлы. Я запутался после того, как сделал тест по сравнению с тем, что увидел в процессе explorer.exe.

  1. Я написал тест со следующими модулями: (C ++)
    DLLLoader.exe ссылается на A.dll в той же папке.
    B.dll ссылается на A.dll (2) в другой папке. (A.dll (2) - это совершенно другая DLL от A.dll, но с тем же именем)
    DLLLoader.exe будет явно загружать B.dll через :: LoadLibrary.
    Теперь я запускаю DllLoader.exe, во-первых, A.dll будет загружен, но затем, когда он попытается загрузить B.dll, он просто потерпел неудачу: я подозреваю, что это потому, что B.dll думает, что A.dll уже загружен в процессе, но фактически загруженный файл не тот, который требуется B.dll, таблица импорта / экспорта не может соответствовать, поэтому загрузка B.dll не удалась.
    Это говорит нам о том, что мы не можем загрузить 2 dll с одинаковыми именами в одном процессе, даже если они имеют разный путь.

  2. Но когда я использовал обозреватель процессов для мониторинга загруженных модулей в процессе explorer.exe в Windows, я мог видеть, как загружаются следующие 2 библиотеки с таким же именем:
    Пользовательская библиотека comctl32.dll управляет библиотекой C: \ WINDOWS \ WinSxS ... \ comctl32.dll
    Библиотека общих элементов управления comctl32.dll C: \ WINDOWS \ system32 \ comctl32.dll

Может ли кто-нибудь из вас пролить свет на это?

Ответы [ 2 ]

6 голосов
/ 15 апреля 2011

См. http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/b3eaa07f-7f92-4693-8aa1-b8fee0b92d2f/ для хорошего обсуждения того, как это можно сделать неявно для WinXP и выше, с помощью контекста активации (манифеста) для управления загрузкой.

6 голосов
/ 27 августа 2009

Это в основном зависит от того, загружаете ли вы dll с полным путем или только по имени файла. Документы LoadLibraryEx хорошо справляются с этой задачей:

Если lpFileName не содержит путь и загружено более одного модуль с тем же базовым именем и расширение, функция возвращает дескриптор загруженного модуля первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...