Что будет, если подключить одну dll два раза?
Ответы (1 шт):
Официальная документация https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya говорит что:
If the specified module is a DLL that is not already loaded for the calling process, the system calls the DLL's DllMain function with the DLL_PROCESS_ATTACH value.
Если данная библиотека ещё не была загружена, будет вызвана функция DllMain этой библиотеки с параметром DLL_PROCESS_ATTACH.
The system maintains a per-process reference count on all loaded modules. Calling LoadLibrary increments the reference count. Calling the FreeLibrary or FreeLibraryAndExitThread function decrements the reference count. The system unloads a module when its reference count reaches zero or when the process terminates (regardless of the reference count).
Система отслеживает количество ссылок на каждый модуль индивидуально для каждого процесса. Вызов LoadLibrary увеличивает счётчик ссылок. Вызов FreeLibrary или FreeLibraryAndExitThread — уменьшает. Система выгружает модель когда счётчик доходит до нуля или при завершении процесса (невзирая на значение счётчика).
Таким образом, повторная загрузка библиотека не приведёт ни к каким негативным последствиям. Не будет ни ошибки, ни переасхода памяти.
Сделано так потому, что кроме самого процесса, загрузить какую-нибудь dll, особенно системную, могут ещё и другие dll, загруженные этим процессом. Или это могут независимо друг от друга несколько статически прилинкованных библиотек.
