Изменения вспомогательной функции отложенной загрузки библиотек DLL по сравнению с Visual C++ версии 6.0
Обновлен: Ноябрь 2007
Если на компьютере установлено несколько версий Visual C++, или если задается собственная вспомогательная функция, то изменения, внесенные в вспомогательную функцию отложенной загрузки библиотек DLL, могут оказать свое влияние. Например:
Функция __delayLoadHelper — это теперь __delayLoadHelper2;
Функция __pfnDliNotifyHook — это теперь __pfnDliNotifyHook2;
Функция __pfnDliFailureHook — это теперь __pfnDliFailureHook2;
Функция __FUnloadDelayLoadedDLL — это теперь __FUnloadDelayLoadedDLL2;
Примечание. |
---|
При использовании вспомогательной функции, заданной по умолчанию, эти изменения никак не влияют на работу. Отсутствуют также изменения, связанные со способом вызова компоновщика. |
Установлено несколько версий 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, которая была задана как библиотека с отложенной загрузкой. Дополнительные сведения см. в разделе Загрузка всех импортов для библиотеки с отложенной загрузкой.