#dll #mfc
#dll #mfc
Вопрос:
Мне было интересно, есть ли способ явно загрузить несколько экземпляров библиотеки DLL (т. Е. С помощью LoadLibrary call). Обычно процесс загружает библиотеку DLL только один раз при вызове LoadLibrary (так что единственная копия библиотеки находится в памяти процесса), и все последующие вызовы LoadLibrary, выполняемые для одной и той же библиотеки, будут возвращать один и тот же дескриптор библиотеки, возвращаемый самым первым вызовом. Чтобы быть более конкретным, я хочу иметь возможность загружать отдельный экземпляр библиотеки DLL для каждого потока, созданного внутри процесса. В настоящее время, если я выполняю LoadLibrary в каждом потоке, я просто получаю один и тот же указатель на один экземпляр библиотеки, находящийся в адресном пространстве процесса, и все потоки фактически ссылаются на одни и те же функции из библиотеки (здесь в моем приложении возникает большой беспорядок). Вместо этого я хочу, чтобы каждый поток создавал отдельный экземпляр библиотеки в отдельном пространстве памяти, чтобы потоки не мешали друг другу при вызове функций из библиотеки.
Ответ №1:
Я не думаю, что это возможно (пока вы не создадите новый процесс и не загрузите DLL в этот процесс). Библиотеки DLL загружаются на уровне процесса (следовательно, имеют записи в блоке управления процессом). Хотя ваша библиотека DLL может определить, создан ли новый поток в хост-приложении, чтобы он мог инициализировать специфические данные TLS в методе DllMain.
Комментарии:
1. Анкур: Можете ли вы привести какой-нибудь пример для вашего объяснения?
2. Вы можете обратиться к документации DllMain по адресу msdn.microsoft.com/en-us/library/windows/desktop /… . Особенно раздел замечаний
3. Анкур: моя цель — создать много экземпляров для одной и той же библиотеки dll.
4. Это будет невозможно. Кстати, почему вы хотите это сделать?
5. Анкур: моему приложению это нужно. У меня есть одна глобальная переменная в моей библиотеке dll. для конкретного сценария два моих имени dll совпадают. В то время я должен разделить эти переменные.