2009-09-07 4 views
6

Я отчаянно нуждаюсь в помощи, мне нужно управлять зависимостью приложения в Visual Studio. Приложение ссылается на DLL только на определенную версию Windows, скажем, Windows 7. и в других средах, DLL не следует загружать. Как я смогу достичь этого с помощью DLL Delay Loading, так как этот вопрос совершенно незначителен для меня, и нет никаких хороших ссылок в Интернете по этому конкретному вопросу.Задержка Загрузка DLLs

С уважением

+1

Вы спрашиваете, как работает задержка или как его можно применить? – xtofl

ответ

8

Вашего проектом может указать, что дллы это зависит от того, должны быть загружены, но при необходимости, указав его в/Input/Delay нагруженной области библиотек DLL компоновщика. Этот параметр может отличаться для разных конфигураций сборки.

+0

Thx для ответного человека, но вы можете использовать giva пример или фрагмент кода, если это применимо :) –

+4

Это точка задержки загрузки: это элемент конфигурации, а не код. – xtofl

+0

Формулировка выглядит неправильно: когда вы говорите: «DLL, в которой вы зависите, должна была быть связана с возможностью загрузки с задержкой», похоже, вы ссылаетесь на создание этой DLL из ее составляющей .obj. Флаг/DELAY фактически применяется к модулю, который выполняет _importing_, а не модуль _imported_. Это также является причиной того, что вы можете задерживать загрузку DLL Windows 2000, которая была бы построена без этой поддержки. – MSalters

1

Вместо использования задержки загрузки вы считаете, что используете dynamicloading с 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); 
+9

Как проще писать код, который может быть автоматически сгенерирован компоновщиком? – xtofl

+2

его штраф, если у вас есть только одна функция, которую вы хотите вызвать ... в противном случае это простой плохой выбор, imo. – Goz

+3

-1 - поддержка задержки загрузки в компоновщике специально направлена ​​на то, чтобы препятствовать вам иметь дело с LoadLibrary() и GetProcAddress()! – Bids

10

MSDN имеет довольно хорошее описание here.

В основном, что вы делаете, это установить 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 с использованием опции компоновщика со вспомогательной функцией (реализация по умолчанию предоставляется Visual C++). Вспомогательная функция загрузит DLL при запуске времени, вызвав для вас LoadLibrary и GetProcAddress.

Вы должны рассмотреть задержки загрузки DLL, если:

Ваша программа не может вызвать функцию в DLL.

Функция в DLL не может быть вызвана до конца в исполнении вашей программы .

Задержка загрузки DLL может быть указана при построении проекта .EXE или .DLL. Проект .DLL, который задерживает загрузку одной или нескольких библиотек DLL, сам по себе не должен вызывать задержанную точку входа в Dllmain.

Смежные вопросы