Декабрь 20081 Динамически подключаемые библиотеки.

Презентация:



Advertisements
Похожие презентации
ДонНУ, кафедра КТ, проф.В.К.Толстых WCF-службы Создание и тестирование.dll-библиотеки WCF-служб Из цикла лекций «Internet-технологии разработки приложений»
Advertisements

Лекция 6 Понятие операционных систем Учебные вопросы: 1. Характеристики ОС 2. Свободные и проприетарные ОС.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
1 Диаграммы реализации (implementation diagrams).
Версия сборки Номер версии сборки имеет формат major.minor.build.revision. Например, Значения major(старший), minor(младший), build (компоновка)
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Тема 1.3. Сервисное программное обеспечение. 1. Понятие операционного окружения Операцио́нное окруже́ние (англ. operating environment) среда, в которой.
Ресурсы WPF Два типа ресурсов WPF: объектные ресурсы (object resource) – определенный.NET-объект, который можно использовать многократно; ресурсы сборки.
ДонНУ, кафедра КТ, проф.В.К.Толстых Web-службы (Web-сервисы) введение введение Разработка в среде Delphi Из цикла лекций «Internet-технологии разработки.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Галактика ERP: Вопросы интеграции c решениями «Intermech» Сергей Белый, Александр Дудорев Управление разработки ПО корпорации «Галактика»
ЛАБОРАТОРНАЯ РАБОТА 1 ПРОЕКТИРОВАНИЕ И РЕАЛИЗАЦИЯ ТАБЛИЦ, ИСПОЛЬЗУЕМЫХ В ТРАНСЛЯТОРЕ Рейн Т. С.
Основы информатики Лекция. Функции Заикин Олег Сергеевич
2.4. Проект C++Builder Стандартный состав проекта: Unit1.cpp –программный файл реализации модуля, связанный с первой формой (Unit i.cpp – программный.
Создание электронных учебников
Информационные технологии Классы памяти auto static extern register Автоматические переменные создаются при входе в функцию и уничтожаются при.
Создание базы данных с помощью Конструктора Создание базы данных без помощи Мастера Теперь попробуем создать базу данных без помощи Мастера. При запуске.
Ekaterina B. Egorkina,© VEELTECH.RU Загрузка и вывод изображений Каким образом можно сохранить картинку в БД, а потом отобразить ее на странице?
Транксрипт:

Декабрь Динамически подключаемые библиотеки

Декабрь Основные вопросы Обзор свойств DLL Обзор свойств DLL Создание DLL и использующего ее приложения Создание DLL и использующего ее приложения Неявное связывание модулей Неявное связывание модулей Явная загрузка DLL и связывание идентификаторов Явная загрузка DLL и связывание идентификаторов

Декабрь DLL – краеугольный камень Windows DLL - dynamic-link libraries - Динамически подключаемые библиотеки DLL - dynamic-link libraries - Динамически подключаемые библиотеки DLL представляет собой набор модулей выполняемого кода, в каждом из которых содержится определенное число функций, вызываемых приложением (исполняемым файлом) или другими DLL. DLL представляет собой набор модулей выполняемого кода, в каждом из которых содержится определенное число функций, вызываемых приложением (исполняемым файлом) или другими DLL. Используются в Windows, начиная с самой первой ее версии. Используются в Windows, начиная с самой первой ее версии. В DLL содержатся все функции Windows API. В DLL содержатся все функции Windows API. Три самые важные DLL: Три самые важные DLL: Kernel32. dll - управление памятью, процессами и потоками, Kernel32. dll - управление памятью, процессами и потоками, User32. dll - поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений), User32. dll - поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений), GDI32. dll - графика и вывод текста. GDI32. dll - графика и вывод текста. DLL, функции которых предназначены для более специализированных задач: DLL, функции которых предназначены для более специализированных задач: AdvAPI32. dll - функции для защиты объектов, работы с реестром и регистрации событий, AdvAPI32. dll - функции для защиты объектов, работы с реестром и регистрации событий, ComDlg32. dll - стандартные диалоговые окна ComDlg32. dll - стандартные диалоговые окна ComCtl32. dll - стандартные элементы управления. ComCtl32. dll - стандартные элементы управления.

Декабрь Некоторые из причин, по которым нужно применять DLL Расширение функциональности приложения. Расширение функциональности приложения. Возможность использования разных языков программирования. Возможность использования разных языков программирования. Более простое управление проектом. Более простое управление проектом. Экономия памяти. Экономия памяти. Разделение ресурсов (иконки, формы, картинки и т.д.). Разделение ресурсов (иконки, формы, картинки и т.д.). Упрощение локализации. Упрощение локализации. Решение проблем, связанных с особенностями различных платформ. Решение проблем, связанных с особенностями различных платформ. Реализация специфических возможностей. Реализация специфических возможностей.

Декабрь Размещение DLL в адресном пространстве процесса Чтобы приложение (или другая DLL) могло вызывать функции, содержащиеся в DLL, образ ее файла нужно сначала спроецировать на адресное пространство вызывающего процесса. Чтобы приложение (или другая DLL) могло вызывать функции, содержащиеся в DLL, образ ее файла нужно сначала спроецировать на адресное пространство вызывающего процесса. Это достигается либо за счет: Это достигается либо за счет: неявного связывания при загрузке, неявного связывания при загрузке, явного связывания в период выполнения. явного связывания в период выполнения. После проецирования DLL на адресное пространство вызывающего процесса, ее функции доступны всем потокам этого процесса. После проецирования DLL на адресное пространство вызывающего процесса, ее функции доступны всем потокам этого процесса. Для потоков код и данные DLL просто дополнительные код и данные, оказавшиеся в адресном пространстве процесса. Для потоков код и данные DLL просто дополнительные код и данные, оказавшиеся в адресном пространстве процесса.

Декабрь Создание DLL и использующего ее приложения Создание DLL Создание DLL Понятие экспорта Понятие экспорта Использование DLL не с С/C++ Использование DLL не с С/C++ Создание EXE-модуля Создание EXE-модуля Понятие импорта Понятие импорта Выполнение EXE-модуля Выполнение EXE-модуля

Декабрь Использование неявного связывания при работе с DLL

Декабрь Создание DLL DLL может экспортировать: DLL может экспортировать: переменные, переменные, функции, функции, С++-классы. С++-классы. Не рекомендуется экспортировать: Не рекомендуется экспортировать: переменные - снижает уровень абстрагирования кода и усложняет его поддержку переменные - снижает уровень абстрагирования кода и усложняет его поддержку классы - можно экспортировать, только если импортирующие их модули транслируются тем же компилятором классы - можно экспортировать, только если импортирующие их модули транслируются тем же компилятором При создании DLL создается заголовочный файл, в котором: При создании DLL создается заголовочный файл, в котором: содержатся экспортируемые из нее переменные (типы и имена) и функции (прототипы и имена). содержатся экспортируемые из нее переменные (типы и имена) и функции (прототипы и имена). определяются все идентификаторы и структуры данных, используемые экспортируемыми функциями и переменными. определяются все идентификаторы и структуры данных, используемые экспортируемыми функциями и переменными. Заголовочный файл: Заголовочный файл: включается во все модули исходного кода DLL. включается во все модули исходного кода DLL. поставляется вместе с DLL, чтобы другие разработчики могли включать его в свои модули исходного кода поставляется вместе с DLL, чтобы другие разработчики могли включать его в свои модули исходного кода

Декабрь Заголовочный файл #ifdef MYLIBAPI #else #define MYLIBAPI extern "С" __declspec(dllimport) #endif //Здесь определяются экспортируемые переменные. MYLIBAPI int g_nResuit; //здесь определяются прототипы экспортируемых //функций MYLIBAPI int Add(int nLeft,int nRight)

Декабрь Файл с исходным текстом DLL #include #include #define MYLIBAPI extern "С \ declspec(dllexport) #include "MyLib.h" int g_nResult; int Add(int nLeft, int nRight){ g_nResult = nLeft + nRight; return(gjiResult); }

Декабрь Понятие экспорта Если модификатор __declspec(dllexport) указан перед переменной, прототипом функции или С++-классом, компилятор встраивает в конечный OBJ-файл дополнительную информацию, обнаружив которую компоновщик: Если модификатор __declspec(dllexport) указан перед переменной, прототипом функции или С++-классом, компилятор встраивает в конечный OBJ-файл дополнительную информацию, обнаружив которую компоновщик: создает lib-файл, создает lib-файл, создает в DLL раздел экспорта, в котором содержится список идентификаторов экспортируемых функций, переменных и классов с относительным виртуальным адресом (relative virtual address, RVA) каждого идентификатора внутри DLL модуля. создает в DLL раздел экспорта, в котором содержится список идентификаторов экспортируемых функций, переменных и классов с относительным виртуальным адресом (relative virtual address, RVA) каждого идентификатора внутри DLL модуля.

Декабрь Содержимое раздела экспорта C:\WINNl\SYSiEM32>DUMPBIN -exports Kernel32. Dll … 1 ordinal base 829 number of functions 829 ordinal hint RVA name A3C6 AddAtomA A367 AddAtomW F7C4 AddConsoleAliasA F78D AddConsoleAliasW C AllocConsole C91D AllocateUserPhysicalPages AreFileApisANSI F1AO AssignProcessToJobObject BackupRead CE BackupSeek 11 A OQ021F21 BackupWrite B lstrlenA C D5 lstrlenW

Декабрь Использование DLL не с С/C++ При экспорте функции компилятор может исказить ее имя (например, добавить подчеркивание, количество и размер параметров и т.д.) При экспорте функции компилятор может исказить ее имя (например, добавить подчеркивание, количество и размер параметров и т.д.) При импорте функции другим компилятором тоже самое имя может быть искажено по другим правилам. При импорте функции другим компилятором тоже самое имя может быть искажено по другим правилам. Нужно указать компилятору Microsoft экспортировать имя функции без искажений. Нужно указать компилятору Microsoft экспортировать имя функции без искажений. создать DEF файл для проекта и включить в него раздел EXPORTS так EXPORTS MyFunc создать DEF файл для проекта и включить в него раздел EXPORTS так EXPORTS MyFunc Добавить в один из файлов исходного кода DLL такую строку: Добавить в один из файлов исходного кода DLL такую строку: #pragma comment(linker, #pragma comment(linker,

Декабрь Создание EXE-модуля iinclude iinclude #include "MyLib\MyLib.h int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, LPTSTR pszCmdLine,int) { int nLeft = 10, nRight = 25; TCHAR sz[100]; wsprintf(sz, TEXT("%d + %d = %d"), nLeft, nRight, Add(nLeft,nRight)); MessageBox(NULL,sz,TEXT("Calculation"), MB_OK); wsprintf(sz, TEXT("The result from the last Add is:%d,g_nResult); TEXT("The result from the last Add is:%d,g_nResult); MessageBox(NULL,sz,TEXT(Last Result"),MB_OK); return(O); }

Декабрь Понятие импорта Разрешая ссылки па импортируемые идентификаторы, компоновщик создает в конечном ЕХЕ-модуле раздел импорта (imports section). В нем перечисляются DLL, необходимые этому модулю, и идентификаторы, на которые есть ссылки из всех используемых DLL. Разрешая ссылки па импортируемые идентификаторы, компоновщик создает в конечном ЕХЕ-модуле раздел импорта (imports section). В нем перечисляются DLL, необходимые этому модулю, и идентификаторы, на которые есть ссылки из всех используемых DLL.

Декабрь Содержимое раздела импорта C:\WINNT\SYSTEM32>DUMPBIN -imports Calc.EXE Microsoft (R) COFF Binary File Dumper Version Copyright (C) Microsoft Corp All rights reserved. Dump of file calc.exe File Type: EXECUTABLE IMAGE Section contains the following imports: SHELL32. dll 10010F4 Import Address Table Import Name Table FFEFFFFF time date stamp FFFFFFFF Index of first forwarder reference 77C A ShellAboutW MSVCRT.dll Import Address Table 10127C0 Import Name Table FFFFFFFF time date stamp FFFFFFFF Index of first forwarder reference memmove _EH_prolog

Декабрь Выполнение EXE-модуля При запуске ЕХЕ-файла загрузчик операционной системы создает для его процесса виртуальное адресное пространство и проецирует на него исполняемый модуль При запуске ЕХЕ-файла загрузчик операционной системы создает для его процесса виртуальное адресное пространство и проецирует на него исполняемый модуль Далее загрузчик анализирует раздел импорта и пытается спроецировать все необходимые DLL на адресное пространство процесса Далее загрузчик анализирует раздел импорта и пытается спроецировать все необходимые DLL на адресное пространство процесса Порядок поиска DLL: Порядок поиска DLL: 1. Каталог, содержащий ЕХЕ-файл. 2. Текущий каталог процесса. 3. Системный каталог Windows 4. Основной каталог Windows 5. Каталоги, указанные в переменной окружения PATH. Если найти DLL не удалось выводится сообщение об ошибке. Если найти DLL не удалось выводится сообщение об ошибке. Найдя и спроецировав на адресное пространство процесса все необходимые DLLмодули, загрузчик настраивает ссылки на импортируемые идентификаторы. Найдя и спроецировав на адресное пространство процесса все необходимые DLLмодули, загрузчик настраивает ссылки на импортируемые идентификаторы. Если ссылки не найдены выводится сообщение об ошибке. Если ссылки не найдены выводится сообщение об ошибке.

Декабрь Явная загрузка DLL и связывание идентификаторов Явная загрузка DLL Явная загрузка DLL Явная выгрузка DLL Явная выгрузка DLL Явное подключение экспортируемого идентификатора Явное подключение экспортируемого идентификатора

Декабрь Явная загрузка DLL Поток приложения явно загружает DLL в адресное пространство процесса, получает виртуальный адрес необходимой DLL-функции и вызывает ее по этому адресу. Поток приложения явно загружает DLL в адресное пространство процесса, получает виртуальный адрес необходимой DLL-функции и вызывает ее по этому адресу. Функции загрузки DLL Функции загрузки DLL HINSTANCE LoadLibrary(PCTSTR pszDLLPathName); HINSTANCE LoadLibrary(PCTSTR pszDLLPathName); HINSTANCE LoadLibraryEx( PCTSTR pszDLLPathName, HANDLE hFile, DWORD dwFlags); HINSTANCE LoadLibraryEx( PCTSTR pszDLLPathName, HANDLE hFile, DWORD dwFlags); Значение типа HINSTANCE, возвращаемое функциями, сообщает адрес виртуальной памяти, по которому спроецирован образ файла. Значение типа HINSTANCE, возвращаемое функциями, сообщает адрес виртуальной памяти, по которому спроецирован образ файла. Если спроецировать DLL на адресное пространство процесса не удалось, функции возвращают NULL Если спроецировать DLL на адресное пространство процесса не удалось, функции возвращают NULL

Декабрь Параметры функций загрузки pszDLLPathName – имя файла DLL pszDLLPathName – имя файла DLL hFile - зарезервирован для использования в будущих версиях и должен быть NULL hFile - зарезервирован для использования в будущих версиях и должен быть NULL dwFlags - либо 0, либо комбинацию флагов dwFlags - либо 0, либо комбинацию флагов DONT_RESOLVE_DLL_REFERENCES – не использовать функцию DllMain DONT_RESOLVE_DLL_REFERENCES – не использовать функцию DllMain LOAD_LIBRARY_AS_DATAFILE – не тратится дополнительное время на подготовку к выполнению LOAD_LIBRARY_AS_DATAFILE – не тратится дополнительное время на подготовку к выполнению LOAD_WITH_ ALTERED_SEARCH_PATH – используется альтернативный алгоритм поиска DLL LOAD_WITH_ ALTERED_SEARCH_PATH – используется альтернативный алгоритм поиска DLL 1. Каталог, заданный в napaмeтре pszDLLPathName. 2. Текущий каталог процесса. 3. Системный каталог Windows. 4. Основной каталог Windows. 5. Каталоги, перечисленные в переменной окружения PATH

Декабрь Использование явного связывания

Декабрь Явная выгрузка DLL Если необходимость в DLL отпадает, ее можно выгрузить из адресного пространства процесса, вызвав функцию: Если необходимость в DLL отпадает, ее можно выгрузить из адресного пространства процесса, вызвав функцию: BOOL FreeLibrary(HINSTANCE hinstDll); Значение hinstDll идентифицирует выгружаемую DLL. Значение hinstDll идентифицирует выгружаемую DLL.

Декабрь Предотвращение повторной загрузки LoadLibrary и LoadLibraryEx лишь увеличивают счетчик числа загрузок указанной библиотеки, a FreeLibrary и FreeLibraryAndExitThread его уменьшают. LoadLibrary и LoadLibraryEx лишь увеличивают счетчик числа загрузок указанной библиотеки, a FreeLibrary и FreeLibraryAndExitThread его уменьшают. Система поддерживает в каждом процессе свой счетчик загрузок DLL. Система поддерживает в каждом процессе свой счетчик загрузок DLL. Чтобы определить, спроецирована ли DLL на адресное пространство процесса, поток может вызывать функцию Gеt Моdulе Напdlе: Чтобы определить, спроецирована ли DLL на адресное пространство процесса, поток может вызывать функцию Gеt Моdulе Напdlе: HINSTANCE GetModuleHandle(PCTSTR pszModuleName); Можно определить полное (вместе с путем) имя DLL или EXE с помощью GetModuleFileName Можно определить полное (вместе с путем) имя DLL или EXE с помощью GetModuleFileName DWORD GetModuleFileName( HINSTANCE hinstModule, PTSTR pszPathName, DWORD cchPath);

Декабрь Явное подключение экспортируемого идентификатора Поток получает адрес экспортируемого идентификатора из явно загруженной DLL вызовом GetProcAddress: Поток получает адрес экспортируемого идентификатора из явно загруженной DLL вызовом GetProcAddress: FARPROC GetProcAddress( HINSTANCE hinstDll, PCSTR pszSymbolName); hinstDll адрес DLL hinstDll адрес DLL pszSymbolName разрешается указывать в двух формах. pszSymbolName разрешается указывать в двух формах. Как адрес строки с нулевым символом в конце, содержащей имя функции. Как адрес строки с нулевым символом в конце, содержащей имя функции. FARPROC pfn = GetProcAddress(hinstDll, "SomeFuncInDll"); FARPROC pfn = GetProcAddress(hinstDll, "SomeFuncInDll"); Вторая форма пapaмeтpa pszSymbolName позволяет указывать порядковый номер нужной функции. Вторая форма пapaмeтpa pszSymbolName позволяет указывать порядковый номер нужной функции. FARPROC pfn = GetProcAddress(hinstDll, MAKEINTRESOURCE(2)); FARPROC pfn = GetProcAddress(hinstDll, MAKEINTRESOURCE(2)); Если идентификатор не найден, GetProcAddress возвращает NULL. Если идентификатор не найден, GetProcAddress возвращает NULL.