Создает ли LoadLibrary отдельные экземпляры? - PullRequest
21 голосов
/ 17 августа 2010

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

Ответы [ 3 ]

23 голосов
/ 17 августа 2010

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

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

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

6 голосов
/ 17 августа 2010

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

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

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

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

4 голосов
/ 17 августа 2010

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

...