Опция линкера(link.exe) /DELAYLOAD:dllname предлагается как альтернатива использованию парочки API LoadLibrary и GetProcAddress. В чём преимущество такой методы(опции) ?
Что-то среднее между статическим и динамическим импортом. С одной стороны, если такой функции/библиотеки в системе нет, то твоя прога всё равно загрузится, с другой - не все адреса функций получать руками (как с LoadLibrary/GetProcAddress), это ложится на плечи delayimp.lib (если не ошибаюсь).
А если исполнение кода "дойдёт" до места вызова требуемой функции API и что тогда? Я так понял что преимущество в том что библиотека(и) не грузятся в память пока не встретится(может вообще не встретится при ветвлении) место вызова требуемой функции и тогда подгружае(ю)тся. Для экономии памяти.
А еще на rsdn.ru есть своя имплементация библиотеки для реализации отложенной загрузки длл с описанием недостатков стандартного MSVC подхода и их аргументированным устранением. Использовать удобно.
пример применения: UxTheme.dll если твоя прога использует некоторые ф-ции этой либы (по работе с интерфейсом), но при этом должна запускаться на более ранних версиях винды, да ещё и без особых трудностей с точки зрения программирования, то DELAYLOAD - самое то. но! если речь идёт не о системных библиотеках, а о какой-нить 3-rd party либе, которой запросто может не оказаться, то разруливать это придётся самому! при линковке нужна Delayimp.lib также поддерживаются хуки: Код (Text): EXTERN __pfnDliNotifyHook2:PDWORD EXTERN __pfnDliFailureHook2:PDWORD ; Delay load import hook notifications dliStartProcessing equ 0 ; used to bypass or note helper only dliNoteStartProcessing equ dliStartProcessing dliNotePreLoadLibrary equ 1 ; called just before LoadLibrary, can override w/ new HMODULE return val dliNotePreGetProcAddress equ 2 ; called just before GetProcAddress, can override w/ new FARPROC return value dliFailLoadLib equ 3 ; failed to load library, fix it by returning a valid HMODULE dliFailGetProc equ 4 ; failed to get proc address, fix it by returning a valid FARPROC dliNoteEndProcessing equ 5 ; called after all processing is done, no bypass possible at this point except by longjmp()/throw()/RaiseException. я сначала гружу либу по LoadLibrary, проверяю хэндл (загрузилась ли), а потом юзаю как обычно через invoke
Я почитал информацию по отложеному импорту на rsdn. Всё преимущество в экономии системных ресурсов(быстрая загрузка приложения которое когда-то может будет юзать библиотеку) и использовании hook-ов(как я и думал). IceStudent И для такого случая нужно ещё писать обработчик програмного исключения. Привожу строки с rsdn: А Рихтер есть в эл.виде ?