Можем ли мы иметь 2 DLL с одинаковым именем, загружаемых в одном процессе
Я говорю о Win32 DLL, эти простые файлы PE. Я запутался после того, как я сделал тест по сравнению с тем, что я видел в процессе explorer.exe.
Я написал тест со следующими модулями: (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 библиотеки с одинаковыми именами в одном процессе, даже если они имеют разный путь.Но когда я использовал обозреватель процессов для мониторинга загруженных модулей в процессе 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 и выше, путем Контекст активации (манифесты) для управления загрузкой.