Использование DLL без библиотеки импорта. Динамическое подключение. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование DLL без библиотеки импорта. Динамическое подключение.



Чтобы загрузить DLL в программу на этапе выполнения, нужно пройти несколько шагов.

Шаг 1:

Использовать функцию LoadLibrary или LoadLibraryEx, чтобы загрузить DLL.

Шаг 2:

Использовать функцию GetProcAddress, чтобы получить указатель на интересующую нас функцию.

Шаг 3:

По окончании работы не забыть выгрузить DLL с помощью функции FreeLibrary.

В своей программе я пользовался функцией LoadLibrary. Эта функция возвращает дескриптор DLL.

Код:

HINSTANCE hDllInstance = LoadLibrary("DLLTEST.dll");

Первый параметр - путь к DLL.

Дальше - нам нужно получить указатель на функцию. Тоесть нужно определить тип указателя. Это делается строкой (в нашем случае)

Код:

typedef void (WINAPI *cfunc)();

Тоесть мы определили cfunc как тип, который указывает на функцию, которая без параметра и возвращает значение void.

Далее - дело за малым.

Код:

 

cfunc NumberList;

cfunc LetterList;

NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList");

LetterList=(cfunc)GetProcAddress((HMODULE)hLib, "LetterList");

 

Мы объявили указатель, и с помощью функции GetProcAddress получаем адрес интересующей нас функции.

Первый параметр - дескриптор DLL. Второй - имя функции.

Теперь можно вызывать эти функции

Код:

NumberList();

LetterList();

 

Исходный файл приложения, использующего библиотеку DLL - консольное приложение Win32 (DLLRUN02.EXE)

#include <windows.h> #include <iostream> #include <stdio.h> #include <conio.h>   using namespace std;   #define MAXMODULE 255 typedef void (WINAPI *cfunc)(); cfunc NumberList; cfunc LetterList; void main() { HINSTANCE hLib=LoadLibrary(TEXT("DLLTEST.DLL")); if(hLib==NULL) { cout << "Unable to load library!" << endl; getch(); return; } char mod[MAXMODULE];   GetModuleFileNameA((HMODULE)hLib, mod, MAXMODULE); cout << "Library loaded: " << mod << endl; NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList"); LetterList=(cfunc)GetProcAddress((HMODULE)hLib, "LetterList"); if((NumberList==NULL) || (LetterList==NULL)) { cout << "Unable to load function(s)." << endl; FreeLibrary((HMODULE)hLib); return; } NumberList(); LetterList(); FreeLibrary((HMODULE)hLib); getch(); }

Этот код загружает DLL (если она находится в путях или в текущем каталоге), а затем определяет адреса функций, которые мы будем вызывать. Конечно, в этом случае пришлось написать намного больше кода, и, соответственно, придется отловить немало ошибок. Однако такой подход универсальней.

Результаты работы DLLRUN02.EXE

Library loaded: C:\DLLTEST\DLLTEST.DLL   This function was called from C:\DLLTEST\DLLRUN02.EXE NumberList(): 0 1 2 3 4 5 6 7 8 9 This function was called from C:\DLLTEST\DLLRUN02.EXE LetterList(): a b c d e f g h i j k l m n o p q r s t u v w x y z

 


Лабораторная работа № 22. Создание и использование DLL (Microsoft Visual C++).

Цель работы:

Овладеть навыками создания и использования динамически подключаемых библиотек (DLL)

Постановка задачи

1. Пользовательские функции хранятся в DLL файле и вызываются в приложении. Продемонстрировать разные способы работы с DLL.

2. Написать функцию с умалчиваемыми параметрами в соответствии с вариантом, продемонстрировать различные способы вызова функции:

  • с параметрами заданными явно,
  • с опущенными параметрами
  • часть параметров задана явно, а часть опущена.

3. Написать функцию с переменным числом параметров в соответствии с вариантом, продемонстрировать вызов функции с различным числом параметров.

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

5. Написать шаблон функций вместо перегруженных функций из задания 3. Написать демонстрационную программу для вызова этих функций. списка параметров

6. Решить уравнение указанным в варианте методом. Уравнение передать в функцию как параметр с помощью указателя.

Варианты

№ варианта Функция с умалчиваемыми параметрами Функция с переменным числом параметров Перегруженные функции и шаблон функции Передача функции как параметра другой функции с помощью указателя
  Печать фамилии, имени и отчества Минимальный элемент в списке параметров Среднее арифметическое массива Метод итераций Отрезок, содержащий корень: [2;3] Точное значение: 2,2985
  Печать фамилии, имени и возраста Максимальный элемент в списке параметров Количество отрицательных элементов в массиве Метод Ньютона Отрезок, содержащий корень: [2;3] Точное значение: 2,2985
  Печать фамилии, курса и группы Количество четных элементов в списке параметров Максимальный элемент в массиве Метод половинного деления Отрезок, содержащий корень: [2;3] Точное значение: 2,2985
  Печать фамилии, имени и рейтинга Среднее арифметическое элементов в списке параметров Минимальный элемент в массиве Метод итераций 0,25x3 + x - 1,2502 = 0 Отрезок, содержащий корень: [0;2] Точное значение: 1,0001
  Печать фамилии, курса и рейтинга Максимальный из элементов в списке параметров, стоящих на четных местах Сортировка массива методом простого обмена Метод Ньютона 0,25x3 + x - 1,2502 = 0 Отрезок, содержащий корень: [0;2] Точное значение: 1,0001
  Печать фамилии, адреса и возраста Максимальный из элементов в списке параметров, стоящих на нечетных местах Сортировка массива методом простого выбора Метод половинного деления 0,25x3 + x - 1,2502 = 0 Отрезок, содержащий корень: [0;2] Точное значение: 1,0001
  Печать названия экзамена, количества сдающих и среднего балла Минимальный из элементов в списке параметров, стоящих на четных местах Сортировка массива методом простого включения Метод итераций Отрезок, содержащий корень: [0;0,85] Точное значение: 0,2624
  Печать названия экзамена, даты экзамена и среднего балла Минимальный из элементов в списке параметров, стоящих на нечетных местах Поиск заданного элемента в массиве Метод Ньютона Отрезок, содержащий корень: [0;0,85] Точное значение: 0,2624
  Печать координат точки Среднее арифметическое из элементов в списке параметров, стоящих на четных местах Поиск заданного элемента в отсортированном массиве Метод половинного деления Отрезок, содержащий корень: [0;0,85] Точное значение: 0,2624
  Вычисление и печать расстояния от точки с координатами x1,y1 до центра координат Среднее арифметическое из элементов в списке параметров, стоящих на нечетных местах Удаление элемента с заданным номером из динамического массива Метод итераций 0,1x2 - x ln x = 0 Отрезок, содержащий корень: [1;2] Точное значение: 1,1183
  Вычисление и печать расстояния от точки с координатами x1,y1 до точки с координатами x2,y2 Минимальный элемент в списке параметров Удаление элемента с заданным ключом из динамического массива Метод Ньютона 0,1x2 - x ln x = 0 Отрезок, содержащий корень: [1;2] Точное значение: 1,1183
  Печать фамилии, имени и отчества Максимальный элемент в списке параметров Добавление элемента с заданным номером в динамический массив Метод половинного деления 0,1x2 - x ln x = 0 Отрезок, содержащий корень: [1;2] Точное значение: 1,1183
  Печать фамилии, имени и возраста Количество четных элементов в списке параметров Добавление элемента после элемента с заданным номером в динамический массив Метод итераций 3x - 4lnx - 5 = 0 Отрезок, содержащий корень: [2;4] Точное значение: 3,2300
  Печать фамилии, курса и группы Среднее арифметическое элементов в списке параметров Номер максимального элемента в массиве Метод Ньютона 3x - 4lnx - 5 = 0 Отрезок, содержащий корень: [2;4] Точное значение: 3,2300
  Печать фамилии, имени и рейтинга Максимальный из элементов в списке параметров, стоящих на четных местах Среднее арифметическое массива Метод половинного деления 3x - 4lnx - 5 = 0 Отрезок, содержащий корень: [2;4] Точное значение: 3,2300
  Печать фамилии, курса и рейтинга Максимальный из элементов в списке параметров, стоящих на нечетных местах Количество отрицательных элементов в массиве Метод итераций Отрезок, содержащий корень: [0;1] Точное значение: 0,5629
  Печать фамилии, адреса и возраста Минимальный из элементов в списке параметров, стоящих на четных местах Добавление элемента с заданным номером в динамический массив Метод Ньютона Отрезок, содержащий корень: [0;1] Точное значение: 0,5629
  Печать названия экзамена, количества сдающих и среднего балла Минимальный из элементов в списке параметров, стоящих на нечетных местах Сортировка массива методом простого обмена Метод половинного деления Отрезок, содержащий корень: [0;1] Точное значение: 0,5629

Методические указания

1. В функции с умалчиваемыми параметрами использовать структурированный тип данных.

2. При демонстрации вызова функции с умалчиваемыми параметрами учесть, что опускать параметры функции можно только с конца.

3. В функции с переменными числом параметров можно использовать любой механизм определения конца списка параметров (передачу количества параметров как параметр функции или использование признака конца списка параметров).

4. Перегрузить функции для массивов типа char, int, и double.

5. Инстанцировать шаблон функции для типов char, int, и double.

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

7. Точность нахождения корня уравнения выбирается не менее 0.001.

8. Полученный результат вычисления корня сравнить с точным значением, заданным в задании.

Содержание отчета

1. Постановка задачи (общая и для конкретного варианта).

2. Определения функций для реализации поставленных задач.

3. Определение функции main().

4. Тесты


17. Регулярные выражения в С++

Краткая теория

Стандартный класс string позволяет выполнять над строками различные операции, в том числе поиск, замену, вставку и удаление подстрок. Тем не менее, есть классы задач по обработке символьной информации, где стандартных возможностей явно не хватает. Чтобы облегчить решение подобных задач, в Net Framework встроен более мощный аппарат работы со строками, основанный на регулярных выражениях.

Регулярные выражения предназначены для обработки текстовой информации и обеспечивают:

1) Эффективный поиск в тексте по заданному шаблону;

2) Редактирование текста;

3) Формирование итоговых отчетов по результатам работы с текстом.



Поделиться:


Последнее изменение этой страницы: 2016-12-11; просмотров: 520; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.67.26 (0.015 с.)