Подтвердить что ты не робот

Создает ли LoadLibrary отдельные экземпляры?

Если я использую Win32 API LoadLibrary для загрузки одной и той же DLL 3 раза подряд, он должен возвращать 3 разных дескриптора, а функции в каждой библиотеке должны иметь разные адреса, если они правильно? (Или он делает что-то "умное" и обнаруживает, что DLL уже загружена для процесса и просто указывает на тот же модуль?)

4b9b3361

Ответ 1

Он делает что-то умное. Windows хранит счетчик ссылок для каждой DLL, загружаемой через LoadLibrary. Вот почему вы должны вызывать FreeLibrary один раз для каждого соответствующего вызова LoadLibrary. Предполагая, что вы не освобождаете DLL, каждый вызов LoadLibrary даст вам тот же дескриптор.

Из документации MSDN для FreeLibrary:

Каждый процесс поддерживает подсчет ссылок для каждого загруженного библиотечного модуля. Этот счетчик ссылок увеличивается каждый раз, когда LoadLibrary вызывается и уменьшается каждый раз, когда вызывается FreeLibrary.

Ответ 2

Если это одна и та же DLL, то она не будет загружать ее снова.

http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx

"Если указанный модуль является DLL, который еще не загружен для вызывающего процесса, система вызывает функцию DLL DllMain со значением DLL_PROCESS_ATTACH. Если DllMain возвращает TRUE, LoadLibrary возвращает дескриптор модуля. Если DllMain возвращает FALSE, система выгружает DLL из адресного пространства процесса, а LoadLibrary возвращает NULL. Небезопасно вызывать LoadLibrary из DllMain.Для получения дополнительной информации см. раздел" Примечания "в DllMain".

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

Ответ 3

Нет, это не так. Чтобы обойти это, вы можете скопировать DLL во временный файл (столько раз, сколько вам нужно загрузить .dll), а затем удалить файлы после завершения.