Динамически загружаемые библиотеки (DLL). Связывание во время выполнения программы.

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

RVA – relative virtual address – формализация данных в файле.

Просмотреть содержимое таблиц экспорта и импорта можно с помощью утилиты dumpbin.exe из состава пакета MS Visual Studio (консольная программа).
Около 30% функций Win32API лежит в kernel32.dll. Чтобы посмотреть ее табл. экспорта:dumpbin.exe kernel32.dll \exports>kernel32.exports
Чтобы посмотреть ее табл. импорта:
dumpbin.exe kernel32.dll \imports>kernel32.imports
kernel32.dll экспортирует функции Win32API, а импортирует функции из ntdll.dll, т.е. Native API.
Другой способ исследования взаимосвязей между библиотеками – использование еще одной программы Dependency Walker (depends.exe) из состава MS Visual Studio (программа с GUI).
После того, как все библиотеки были загружены по табл. импорта от программы и по табл. импорта от библиотек, управление передается процессу – статическая загрузка. Динамическая загрузка в процессе работы программы может подгружать библиотеки.
Создание DLL - динамически загружаемой библиотеки
Для создания DLL необходимо при создании проекта в среде MS Visual Studio указать тип проекта не exe-файл, а dll. У DLL отсутствует функция WinMain. Вместо нее используется DllMain.
BOOL WINAPI DllMain(
                   HINSTANCE hInstDll, // HINSTANCE можно заменить на HMODULE
                   DWORD fdwReason,
                   LPVOID lpvReserved);
1.    Адрес точки загрузки модуля в память. Для программ он равен 0x400000, для библиотек 0x10000000 (по умолчанию). Если 2 библиотеки загрузить по этому адресу, то загрузчик сам сдвинет 2-ю библиотеку.
2.    Причина вызова функции.
3.    Зависит от 2.
Функция DllMain вызывается в 4-х случаях, при этом fdwReason будет принимать следующие значения:
-         DLL_PROCESS_ATTACH – при загрузке dll в адресное пространство процесса;
-         DLL_THREAD_ATTACH – при создании новой нити;
-         DLL_THREAD_DETACH – при уничтожении нити;
-         DLL_PROCESS_DETACH – при выгрузке dll из адресного пространства процесса.
-         Параметр lpvReserved имеет смысл в 2-х случаях:
-         при DLL_PROCESS_ATTACH этот параметр равен 0 для динамической загрузки и не равен 0 для статической загрузки;
-         при DLL_PROCESS_DETACH этот параметр равен 0 для динамической выгрузки и не равен 0 для выгрузки в связи с завершением процесса.
Т.о., библиотека может настраиваться для процесса и для нити как ей хочется. Любую ф-цию, переменную, класс библиотеки можно сделать экспортируемыми, т.е. подключаемыми извне с помощью табл. экспорта. Чтобы адрес ресурса был помещен в табл. экспорта необходимо непосредственно перед определением ресурса написать ключевые слова:
__declspec (dllexport) int;                                      // для переменной
__declspec (dllexport) void func();                          // для функции
class __declspec (dllexport) MyClass;                      // для класса
Динамическое связывание
HMODULE LoadLbrary(
                   LPCTSTR sz Name);
Эта функция загружает библиотеку. Ошибка, если библиотека не найдена. Адрес экспортируемого ресурса L задается функцией:
VOID * GetProcAddress (
                   HMODULE hDLL,
                   LPCSTR szResourceName);
GetProcAddress не может иметь Unicode, а только ASCII.
В таблице экспорта ресурс может находиться как именованный, так и не именованный. Эта функция загружает и такие и такие.
LPCSTR – не указатель, а номер ресурса (0-65535).
Компилятор при создании динамически загружаемой библиотеки формирует имена экспортируемых ресурсов таким образом, чтобы в имени содержалась вся инф-ция о параметрах функции и о параметре возврата.
Void *Func()
“& Func@@ YAXXZ
Компилим DLL, смотрим, что она экспортирует с помощью утилиты DumpBin.exe . смотрим, во что преобразовалось наше имя и подставляем его в функцию GetProcAddress.
Исп-ем *.def – файл. В них лежат имена экспортируемых ресурсов.
Func_Func.
После работы с библиотекой ее можно выгрузить. Это делает функция freelibraty:
BOOL FreeLibrary (
                   HMODULE hDLL);

1 комментарий:

  1. Harrah's Cherokee Casino & Hotel Map | Mapyro
    Harrah's Cherokee Casino & Hotel is a hotel 세종특별자치 출장안마 in 충청북도 출장안마 Cherokee, 양산 출장마사지 North Carolina. Read reviews, view photos, see special offers, and contact Harrah's Cherokee Casino 목포 출장샵 & Hotel 경산 출장샵

    ОтветитьУдалить