Задержка загрузки DLL
Я остро нуждаюсь в помощи, мне нужно управлять зависимостями приложений в Visual Studio. Приложение ссылается на DLL только в определенной версии Windows, скажем, Windows 7. и в других средах DLL не должна загружаться. Как я смогу добиться этого, используя DLL Delay Loading, так как эта тема является совершенно новой для меня, и нет никаких хороших ссылок в Интернете по этому конкретному вопросу.
С уважением
3 ответа
Ваш проект может указать, что dll, от которого он зависит, должен быть загружен, когда это необходимо, указав его в поле Linker/Input/Delay Loaded DLLs. Этот параметр может отличаться для разных конфигураций сборки.
MSDN имеет довольно хорошее описание здесь.
По сути, вы устанавливаете DLL-библиотеку в разделе отложенной загрузки. Затем он не будет загружать эту DLL, пока вы не сделаете вызов функции, которая находится в этой DLL.
Из приведенной выше ссылки:
Компоновщик Visual C++ теперь поддерживает отложенную загрузку DLL. Это избавляет вас от необходимости использовать функции Windows SDK LoadLibrary и GetProcAddress для реализации отложенной загрузки DLL.
До Visual C++ 6.0 единственным способом загрузки DLL во время выполнения было использование LoadLibrary и GetProcAddress; операционная система будет загружать DLL при загрузке исполняемого файла или DLL, использующей его.
Начиная с Visual C++ 6.0, при статическом связывании с DLL компоновщик предоставляет параметры для отсрочки загрузки DLL до тех пор, пока программа не вызовет функцию в этой DLL.
Приложение может отложить загрузку DLL с помощью параметра компоновщика /DELAYLOAD (Delay Load Import) с вспомогательной функцией (реализация по умолчанию, предоставляемая Visual C++). Вспомогательная функция загрузит DLL во время выполнения, вызвав для вас LoadLibrary и GetProcAddress.
Вы должны рассмотреть задержку загрузки DLL, если:
Ваша программа может не вызывать функцию в DLL.
Функция в DLL может быть вызвана только в конце выполнения вашей программы.
Задержка загрузки DLL может быть указана при сборке проекта.EXE или.DLL. Проект.DLL, который задерживает загрузку одной или нескольких библиотек DLL, сам по себе не должен вызывать загруженную с задержкой точку входа в Dllmain.
Вместо использования отложенной загрузки, вы рассматривали возможность использования динамической загрузки с LoadLibrary
а также GetProcAddress
? Это, вероятно, будет проще в использовании.
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
PGNSI pGNSI;
SYSTEM_INFO si;
ZeroMemory(&si, sizeof(SYSTEM_INFO));
pGNSI = (PGNSI) GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")),
"GetNativeSystemInfo");
if(NULL != pGNSI)
pGNSI(&si);
else GetSystemInfo(&si);