- •1. Библиотеки. Статическая библиотека. Создание.
- •2. Библиотеки. Статическая библиотека. Использование.
- •3. Библиотека. Динамическая библиотека. Создание.
- •4. Библиотека. Динамическая библиотека. Статическая загрузка.
- •5. Библиотека. Динамическая библиотека. Динамическая загрузка.
- •7. Библиотеки. Динамическая библиотека. Сравнение способов загрузки.
- •8.Использование файлов при создании программы.
- •9. Позиционирование при работе с файлами. Функция.
- •10. Отображение файла на памяти. Назвать назначения параметров в функции.
- •11. Управление памятью. Для чего используется.
- •12.Блокирование памяти. В каком случае используется. Функции для блокирования.
- •13.Управление памятью. Для чего используют функции:
- •14. Для чего создаются процессы. Функции.
- •15. Назначение функций:
- •16. Асинхронный ввод/вывод:
- •17. Для чего используются потоки. Функции
- •18. Приоритеты процессов и потоков. Функции:
- •19. Синхронизация потоков. Interlocked функции. Назначение функций:
- •20. Синхронизация потоков. Критические секции. Функции.
- •21. Использование Event для синхронизации. Функции:
- •22. Использование Semaphore для синхронизации. Функции:
- •23. Использование WaitableTimerдля синхронизации. Функции:
- •24) Управление процессом. Планирование и диспетчеризация.
- •25) Использование Mutex для синхронизации. Функции.
- •26) Сравнение сегментной и страничной адресации
- •27) Страничная организация памяти.
- •29) Локальная память компьютеров. Функции
- •30. Соглашения по вызову, объяснить следующие с, срр, fastcall, stdcall. Дайте рекомендации по использованию соглашения.
7. Библиотеки. Динамическая библиотека. Сравнение способов загрузки.
Статическая загрузка |
Динамическая загрузка |
При статическом подключении (implicit linking) линкеру передается библиотека импорта (обычно имеет расширение lib), содержащая список переменных и функций DLL, которые могут использовать приложения. Обнаружив, что программа обращается хотя бы к одной из них, линкер добавляет в целевой exe-файл таблицу импорта. Таблица импорта содержит список всех DLL, которые использует программа, с указанием конкретных переменных и функций, к которым она обращается. Позже, когда exe-файл будет запущен, загрузчик проецирует все DLL, перечисленные в таблице импорта, на адресное пространство процесса; в случае неудачи весь процесс немедленно завершается. Статическое подключение - это наиболее простой метод подключения DLL к нашей программе. Все, что нам нужно - это передать линкеру имя библиотеки импорта, чтобы он использовал ее в процессе сборки. Сделать это можно различными способами. Во-первых, можно непосредственно добавить файл MyDll.lib в проект посредством команды Project->Add to project->Files... Во-вторых, можно указать имя библиотеки импорта в опциях линкера. Для этого откройте окно настроек проекта (Project->Settings...) и добавьте в поле Object/Library modules на вкладке Link имя MyDll.lib. Наконец, можно встроить ссылку на библиотеку импорта прямо в исходный код программы. Для этого используется директива #pragma c ключем comment( lib, “имя библиотеки.lib” ). Достоинства: 1. Если нет необходимой DLL, программа не будет загружена. 2. Использование по сложности одинаково с использованием статических библиотек. Недостатки: 1. Файл с расширением lib является платформенно зависимым, то есть Visual Studio, C + + Builder используют различные файлы. 2. Библиотека загружается при загрузке программы и остается загруженной до тех пор, пока программа не завершится. А возможно, что библиотека совсем не потребуется (выполняется часть программы, которая не вызывает функций библиотеки), или используется только в начале программы. 3. Не может использоваться для DLL, содержащие только ресурсы и не вмещают экспортируемых функций.
|
При динамическом подключении (explicit linking) приложение вызывает функцию LoadLibrary, чтобы загрузить DLL, затем использует функцию GetProcAddress, чтобы получить указатели на требуемые функции (или переменные), а по окончании работы с ними вызывает FreeLibrary, чтобы выгрузить библиотеку и освободить занимаемые ею ресурсы. Например загрузка DLL выглядит так: HMODULE hLib; hLib = LoadLibrary("MyDll.dll"); Например вызов функций DLL выглядит так: void (*pFunction)(int, int); (FARPROC &)pFunction = GetProcAddress(hLib, "Function"); pFunction(0, 0);
Доступ к переменным в DLL выглядит так: int *pVar; (FARPROC &)pVar = GetProcAddress(hLib, "Var"); *pVar = 123; После того, как работа с библиотекой закончена, ее можно выгрузить, чтобы она не занимала системные ресурсы. Для этого используется функция FreeLibrary, которой следует передать дескриптор освобождаемой библиотеки. Например выгрузка библиотеки выглядит вот так: FreeLibrary(hLib); Динамический метод подключения лишен недостатков как при статическом подключении, но делает программирование более неудобным, поскольку требуется следить за своевременными вызовами LoadLibrary и соответствующими им вызовами FreeLibrary, а также получать адрес каждой функции через вызов GetProcAddress.
|