У меня есть программа, которая хранит плагины в нескольких каталогах, например:
root/
core/bin/
app.exe
core.dll
plugin.dll
support.dll
a/bin/
a.dll
a_support.dll
В этом примере a.dll
импортирует core.dll
, support.dll
и a_support.dll
(они в указанном порядке в таблице импорта). a_support.dll
импорт support.dll
. Я могу изменить все, кроме модулей поддержки, это редиректы сторонней библиотеки.
Мой код вызывает LoadLibraryEx(name, NULL, LOAD_WITH_ALTERED_SEARCH_PATH)
для загрузки каждого плагина. Для core.dll
и plugin.dll
это работает нормально.
Когда я пытаюсь загрузить a.dll
, происходит сбой , говоря, что a_support.dll
не найден . Нет ошибок о core.dll
или support.dll
, возможно, потому что они уже в памяти.
Я подозреваю, что когда загружено a_support.dll
, support.dll
не может быть найдено, но это кажется необычным, поскольку a.dll
, кажется, импортирует support.dll
до a_support.dll
.
Возможно ли использовать эту компоновку модулей ? Сможет ли система использовать уже загруженные вспомогательные библиотеки DLL, или она начнет их искать и произойдет сбой? Будет ли способ справиться с этим через манифесты? Есть ли способ заставить это работать, или мне придется переместить все модули в один каталог?
Редактировать: По предложению Адриана МакКарти я запустил последовательность загрузки с отслеживанием Process Monitor, и кажется, что когда я вызываю LoadLibrary("root/a/bin/a.dll", ...)
, он начинается с поиска в корневом каталоге, затем в системных каталогах, затем вниз по пути. По какой-то причине он никогда не ищет a/bin/
, что ему очень нужно.
Я дважды проверил пути и заметил, что мои вызовы для загрузки plugin.dll
используются по неправильному пути (root, вместо root / core / bin). В любом случае, core.dll
загружался правильно. После исправления я попробовал еще раз, и на этот раз a.dll
находит a_support.dll
и, кажется, загружается. Однако это не имеет никакого смысла, если только загрузчик не использует support.dll
откуда-то еще. Журнал procmon не показывает, что он даже пытался загрузить support.dll
снова, поэтому я не совсем уверен, есть ли на самом деле проблема (кроме поведения загрузчика, которое не имеет смысла).