DLL перенаправление для нескольких dll, связанных с * stati c - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь загрузить несколько экземпляров одной и той же DLL в проекте VS2010 C ++ (конфигурация x32).

, поэтому у меня есть основной dll - Parent.dll, который объединяется с некоторыми другими kids.dll (kid1. dll, kid2.dll, et c ..., kid8.dll) stati c -linked - когда я загружаю Parent.dll, автоматически загружаются файлы kids.dll (они расположены по одному пути, поэтому они могут загружаться успешно).

в моем коде я использую LoadLibraryEx (Path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) для загрузки экземпляров Parent.dll. моя проблема возникает, когда я пытаюсь создать несколько экземпляров Parent.dll: я делаю копию всех библиотек DLL в другой путь, переименовываемый в имя родительского (например, Parnet_1.dll), в отношении других библиотек DLL - их нельзя переименовать потому что они связаны c. (Я не могу получить доступ к исходному коду Pa rnet .dll и изменить его на Dynami c -load).

С 1 экземпляром - Parent.dll и все его дети успешно загружаются. когда я пытаюсь загрузить другой экземпляр, Parent_1.dll, файл Parent_1.dll загружен успешно, но другие детские библиотеки DLL не загружены: они имеют точно такие же имена, которые уже загружены из 1-го экземпляра - вот что заставляет мою программу cra sh.

, что я пытаюсь сделать, это динамически загрузить несколько экземпляров Parent.dll, что каждый родительский файл будет иметь свой собственный загруженный kids.dll. другими словами - рекурсивное перенаправление

Я искал по всему inte rnet и не смог найти решение для моего случая. Я увидел там эту статью: https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-redirection и попробовал MyCode.exe.local, и он не работал.

Я также попытался перенаправить DLL с помощью манифеста, но не мог понять, как делайте это правильно.

Спасибо за любые усилия, чтобы помочь!

1 Ответ

0 голосов
/ 30 марта 2020

Пока файлы одинаковы, это не будет работать.

DLL совместно используется всем процессом, если DLL уже загружена, новый вызов LoadLibrary будет только возвращать ссылку на это уже загруженный модуль. Было бы неэффективно использовать библиотеки DLL по-разному.

Если вам абсолютно необходимы разные нагрузки, вы можете переименовать файлы (хотя это быстро станет громоздким (и даже тогда я не совсем уверен, что это будет работать (библиотеки имя закодировано как часть двоичного файла, и я не уверен, что windows продолжит загрузку, если новый файл будет LoadLibrary'd, и что внутреннее имя соответствует имени уже загруженной библиотеки).

Если вы можете работать так, чтобы parent1.dll выгружался (вместе со всеми дочерними элементами) до загрузки parent2.dll, тогда ни один из вышеперечисленных не должен вступать в игру.

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