Поделиться через


Изменения вспомогательной функции отложенной загрузки библиотек DLL по сравнению с Visual C++ версии 6.0

Обновлен: Ноябрь 2007

Если на компьютере установлено несколько версий Visual C++, или если задается собственная вспомогательная функция, то изменения, внесенные в вспомогательную функцию отложенной загрузки библиотек DLL, могут оказать свое влияние. Например:

  • Функция __delayLoadHelper — это теперь __delayLoadHelper2;

  • Функция __pfnDliNotifyHook — это теперь __pfnDliNotifyHook2;

  • Функция __pfnDliFailureHook — это теперь __pfnDliFailureHook2;

  • Функция __FUnloadDelayLoadedDLL — это теперь __FUnloadDelayLoadedDLL2;

2b054ds4.alert_note(ru-ru,VS.90).gifПримечание.

При использовании вспомогательной функции, заданной по умолчанию, эти изменения никак не влияют на работу. Отсутствуют также изменения, связанные со способом вызова компоновщика.

Установлено несколько версий Visual C++

Если на компьютере установлено несколько версий Visual C++, следует убедиться, что компоновщик соответствует библиотеке delayimp.lib. Если имеется несоответствие, то возникнет ошибка компоновщика, сообщающая, что либо ___delayLoadHelper2@8, либо ___delayLoadHelper@8 является неразрешенным внешним символом. Первое означает, что новый компоновщик используется со старой библиотекой delayimp.lib, а второе означает, что старый компоновщик используется с новой библиотекой delayimp.lib.

Если была получена неустранимая ошибка компоновщика, следует выполнить команду dumpbin /linkermember:1 для той библиотеки delayimp.lib, в которой предположительно содержится вспомогательная функция, чтобы увидеть, какая именно вспомогательная функция задана. Вспомогательная функция могла быть также задана в объектном файле; следует выполнить команду dumpbin /symbols и найти функцию delayLoadHelper(2).

Если известно, что установлен компоновщик Visual C++ 6.0:

  • Выполните программу dumpbin для файла LIB или OBJ вспомогательной функции отложенной загрузки, чтобы определить, определен ли символ __delayLoadHelper2. В случае его отсутствия компоновка будет прервана.

  • Определите символ __delayLoadHelper в файле LIB или OBJ вспомогательной функции отложенной загрузки.

Заданная пользователем вспомогательная функция

Если задана собственная вспомогательная функция, и используется текущая версия Visual C++, необходимо выполнить следующие действия:

  • Переименуйте вспомогательную функцию, дав ей имя __delayLoadHelper2.

  • С тех пор как абсолютные адреса (VA) указателей дескриптора задержки (ImgDelayDescr в delayimp.h) были заменены на относительные адреса (RVA) для правильной работы как в 32-разрядных, так и в 64-разрядных программах, требуется преобразовывать их обратно в указатели. Была введена новая функция, PfromRva; ее можно найти в файле delayhlp.cpp. Эту функцию можно использовать в каждом из полей дескриптора для обратного преобразования их в 32-разрядные или 64-разрядные указатели. Вспомогательную функцию отложенной загрузки, заданную по умолчанию, по-прежнему можно использовать в качестве образца.

Загрузка всех импортов для библиотеки DLL с отложенной загрузкой

Компоновщик может загружать все импорты из библиотеки DLL, которая была задана как библиотека с отложенной загрузкой. Дополнительные сведения см. в разделе Загрузка всех импортов для библиотеки с отложенной загрузкой.

См. также

Ссылки

Понятие вспомогательной функции