Возможно вы искали: 'STACKED'

May 15 2025 18:52:53
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Отложенная загрузка библиотек под Windows (gcc lib)

Отложенная загрузка библиотек под Windows (gcc lib)

Ключевые слова: gcc, lib, (найти похожие документы)

From: Владислав Лазаренко <vlazarenko at miratech.biz>
Newsgroups: email
Date: Mon, 16 Nov 2004 14:31:37 +0000 (UTC)
Subject: Отложенная загрузка библиотек под Windows

Отложенная загрузка библиотек

Владислав Лазаренко, 17 ноябрь 2004


Целостность программного продукта
---------------------------------

Как вы знаете, многие программы зависят от каких-либо динамически
подключаемых библиотек, которые содержат определенный код,
используемый в программе (исполняемом файле). Таким образом, чтобы
сохранить целостность программного продукта, на компьютере
пользователя обязательно должны присутствовать не только исполняемые
файлы, но и необходимые библиотеки. Как правило, такие зависимости
проверяются на этапе установки, и никаких ошибок в последствии не
возникает, но бывают и другие, более сложные ситуации. Например,
заказчик поставил задачу написать программу, которая должна проверять
наличие установленного СУБД клиента (в виде динамически подключаемых
библиотек) и, если клиент установлен, выполнить определенные операции
с СУБД, используя эту библиотеку. А что же произойдет, если какой-то
из библиотек не окажется? Все очень просто - произойдет ошибка на
этапе загрузки исполняемого файла операционной системой. В ОС Windows
, например, будет показано неприветливое окно с надписью " Unable to
locate DLL ". Самое обидно в этой ситуации то, что управление не будет
передано программе, и вы никак не сможете эту ситуацию корректно
обработать, хотя иногда это очень необходимо.


Что такое отложенная загрузка библиотек и для чего она нужна
------------------------------------------------------------

Существует несколько решений описанной выше проблемы. Одно из них -
запускать одну программу из скрипта или другой программы и проверять
корректность её запуска и/или выполнения. Это выглядит не очень
элегантно, к тому же в ОС Windows будет показан диалог, на который
пользователь должен будет среагировать нажатием кнопки " OK ", а это
не всегда приемлемо. Есть второе, более трудоемкое решение; оно
заключается в том, чтобы не линковать программу с динамически
подключаемыми библиотеками, а загружать их на этапе выполнения. Этого
можно добиться с помощью функций загрузки библиотеки и поиска символов
внутри неё. Для ОС Windows это функции LoadLibrary и GetProcAddress ,
в UNIX системах это функции dlopen и dlsym . Все очень просто, в
начале выполнения программы пытаемся загрузить все необходимые функции
из библиотек вручную, если это не удается, завершаем выполнение
программы с определенным кодом ошибки. Это и называется отложенная
загрузка библиотек.


Microsoft идет навстречу программистам
--------------------------------------

Разработчики Visual C ++ решили облегчить жизнь программистам, теперь,
от версии 6.0, не нужно заниматься сложной и кропотливой работой,
писать код для загрузки библиотек и обработки ошибок. Линкер
предоставляет опцию / DelayLoad для отложенной загрузки библиотеки.
Загрузка библиотеки будет автоматически происходить только перед
первым вызовом функции из оной. Хочу заметить, что отложенная загрузка
kernel 32. dll не поддерживается.


Загрузка библиотеки происходит в " user space " с помощью функции,
которая находится в библиотеке delayimp и называется helper функция.
Если вы используете механизм отложенной загрузки, то должны линковать
программу с этой библиотекой.



Указание библиотек для отложенной загрузки
------------------------------------------

Вы можете указать, какие библиотеки должны загружаться по мере
выполнения программы с помощью опции линкера / DelayLoad : DLLName .
Ниже приведен пример отложенной загрузки user 32. dll :


// cl t . cpp user 32. lib delayimp . lib / link / DELAYLOAD : user 32. dll
# include < windows . h >
// не комментируйте следующие две строки, чтобы убрать . libs из командной строки
// #pragma comment (lib, "delayimp")
// #pragma comment (lib, "user32")

int main ()
{

// user 32. dll будет загружена здесь
MessageBox(0, "Hello", "Hello", MB_OK);
return (0);

}


Явная выгрузка библиотеки
-------------------------

Опция линкера / delay : unload позволяет вам явно выгрузить
библиотеку. По умолчанию это делается автоматически тогда, когда
вызовы из этой библиотеки более не используются, при этом адреса этих
вызовов остаются в IAT ( import address table ). Однако если вы
сделаете это вручную с помощью опции / delay : unload и функции
__FUnloadDelayLoadedDLL2, то вспомогательная функция загрузки символов
( helper function ) сбрасывает значения в IAT .

Пример:

// линкуем с опциями / link / DELAYLOAD : MyDLL . dll / DELAY : UNLOAD
#include <windows.h>
#include <delayimp.h>
#include "MyDll.h"
#include <stdio.h>

#pragma comment (lib, "delayimp")
#pragma comment (lib, "MyDll")

int main()
{
BOOL TestReturn;
// MyDLL.DLL будет загружена тут
fnMyDll ();

// MyDLL . dll будет выгружена тут
TestReturn = __FUnloadDelayLoadedDLL2("MyDll.dll");
if (TestReturn)
( void ) printf (" n библиотека была выгружена");
else
( void ) printf (" n библиотека не была выгружена");

return (0);
}


Имплементацию функции __ FUnloadDelayLoadedDLL 2 вы можете найти в
файле Visual Studio - VC 7 INCLUDE DELAYHLP . CPP .


Загрузка всех символов из библиотеки
------------------------------------


Функция __ HrLoadAllImportsForDll , которая определена в файле
delayhlp . cpp загружает все символы из указанной библиотеки.
Использование этой функции позволяет обработать возможные ошибки в
едином месте вашего кода, без отлавливания исключений на этапе вызова
каждой функции загруженной библиотеки. Пример:


if ( FAILED (__ HrLoadAllImportsForDll (" delay 1. dll ")))
{
( void ) printf ("ошибка загрузки символов n ");
exit(2);
}


Обработка ошибок
----------------

Как и везде, в загрузке тоже может произойти ошибка. Как её
обработать, если вспомогательная функция загрузки вызывается анонимно?
Очень просто, для этого существуют так называемые указатели на функции
обработчики ( hooks ). Есть два таких указателя, это указатель на
функцию обработки ошибок и на функцию, которая обрабатывает
нотификации (оповещения о каком-либо действии). Указатель такого типа
определяется так:


typedef FARPROC ( WINAPI * PfnDliHook ) (
unsigned dliNotify ,
PDelayLoadInfo pdli
);


Определение типа PDelayLoadInfo :

typedef struct DelayLoadInfo {
DWORD cb; // размер структуры
PCImgDelayDescr pidd ; // что угодно здесь
FARPROC * ppfn ; // указатель на загружаемую функцию
LPCSTR szDll ; // имя библиотеки
DelayLoadProc dlp ; // имя процедуры
HMODULE hmodCur ; // hInstance загруженной библиотеки
FARPROC pfnCur ; // функция-обработчик, которая будет вызвана
DWORD dwLastError ; // ошибка (если нотификация об ошибке)
} DelayLoadInfo, * PDelayLoadInfo;


Оповещения
----------

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


Указатель определяется так (уже определен):

ExternC PfnDliHook __ pfnDliNotifyHook 2;


Флаги операций:

1) Проверка, загружена ли уже библиотека
2) Вызов функции LoadLibrary для обработки библиотеки
3) Вызов функции GetProcAddress для получения адреса процедуры
4) Завершение всех операций


Ошибки
------


Указатель определяется так (уже определен):

ExternC PfnDliHook __pfnDliFailureHook2;


1) Ошибка загрузки библиотеки в память
2) Ошибка поиска адреса процедуры в загруженной библиотеке


Обратите внимание, что в конце имен определенных указателей стоят
цифры 2, это только для Visual Studio версии 7.0, для версии же 6.0
двойки в имени отсутствуют.


* Пример программы, в которой загружается библиотека mydll . dll и
обрабатывается ошибка:


// cl example.cpp /link /DELAYLOAD:mydll.dll
#include <windows.h>
#include <delayimp.h>

#pragma comment (lib, "delayimp")
#pragma comment (lib, "mydll")

// если необходимую библиотеку/функцию не удалось найти,
// корректно завершаем выполнение программы, возвращая код 1

static FARPROC WINAPI MyLibLoadFailure(unsigned notify, DelayLoadInfo *info)
{
exit(1);
}

int main()
{
__pfnDliFailureHook = NWLoadFailure; // установили свой обработчик ошибок

// mydll . dll будет загружена здесь
my _ foo ();
return (0);
}


По материалам MSDN и собственного опыта.


Автор: Владислав Лазаренко <vlazarenko at miratech.biz >. Все права защищены.

Рецензенты :
1) Степанов Кирилл <kstepanov at miratech.biz>
1183 Прочтений •  [Отложенная загрузка библиотек под Windows (gcc lib)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Отложенная загрузка библиотек под W... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка