Опция линкера /DELAYLOAD

Тема в разделе "WASM.WIN32", создана пользователем Tiro, 10 ноя 2006.

  1. Tiro

    Tiro New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2006
    Сообщения:
    49
    Адрес:
    Russia
    Опция линкера(link.exe) /DELAYLOAD:dllname предлагается как альтернатива
    использованию парочки API LoadLibrary и GetProcAddress.
    В чём преимущество такой методы(опции) ?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Что-то среднее между статическим и динамическим импортом. С одной стороны, если такой функции/библиотеки в системе нет, то твоя прога всё равно загрузится, с другой - не все адреса функций получать руками (как с LoadLibrary/GetProcAddress), это ложится на плечи delayimp.lib (если не ошибаюсь).
     
  3. Tiro

    Tiro New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2006
    Сообщения:
    49
    Адрес:
    Russia
    А если исполнение кода "дойдёт" до места вызова требуемой функции API и что тогда?
    Я так понял что преимущество в том что библиотека(и) не грузятся в память пока не встретится(может вообще не встретится при ветвлении) место вызова требуемой функции
    и тогда подгружае(ю)тся. Для экономии памяти.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Почитай подробнее об отложенном импорте. У Рихтера или ещё где.
     
  5. TheRawGod

    TheRawGod New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    71
    А еще на rsdn.ru есть своя имплементация библиотеки для реализации отложенной загрузки длл с описанием недостатков стандартного MSVC подхода и их аргументированным устранением. Использовать удобно.
     
  6. Jupiter

    Jupiter Jupiter

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

    Tiro New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2006
    Сообщения:
    49
    Адрес:
    Russia
    Я почитал информацию по отложеному импорту на rsdn. Всё преимущество в экономии системных ресурсов(быстрая загрузка приложения которое когда-то может будет юзать библиотеку) и использовании hook-ов(как я и думал).

    IceStudent
    И для такого случая нужно ещё писать обработчик програмного исключения.
    Привожу строки с rsdn:
    А Рихтер есть в эл.виде ?
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Tiro
    Есть, но ссылка только одна: гугл.