Задержка загрузки 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);
Другие вопросы по тегам