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

Я говорю о 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 библиотеки с одинаковыми именами в одном процессе, даже если они имеют разный путь.

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

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам