В этой статье речь пойдет о динамическом подключении библиотеки dll к программе, разрабатываемой в Visual Studio. Иначе говоря, будет написан клиент к dll-файлу. Разработку будем вести на языке программирования Си.
Динамическое подключение dll (в отличие от статического через References) позволяет экономить ресурсы: библиотека загружается не при запуске программы, а во время ее выполнения, когда действительно необходимо обратится к функциям библиотеки. Dll будет загружена при выполнении соответствующего оператора.
В статье «Как создать dll в Visual Studio» мы написали библиотеку dll с двумя функциями: add и sub, которые соответственно складывают и вычитают два целых числа. Теперь напишем на языке программирования Си клиент к этому dll-файлу.
Создадим в Visual Studio консольное приложение и поместим в папку проекта Dubug dll-файл.
Перейдем к коду приложения. Для начала подключим необходимые библиотеки.
1 2 3 |
#include <Windows.h> #include <stdio.h> #include <conio.h> |
Определим новый тип данных — function. Это будет указатель на функцию с контролем прототипа функции (аргументы функции — это числа a и b). Указатель на функцию необходим для того, чтобы хранить в нем ее адрес, полученный из библиотеки dll. По этому указателю будет осуществлен вызов функции.
1 |
typedef int (*function)(int a, int b); |
Теперь напишем функцию main().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
int main() { HMODULE hm = LoadLibrary(L"DLLvscode.dll"); if(hm == NULL) { printf("DLLvscode.dll not found!\n"); } else { function add = (function)GetProcAddress(hm, "add"); function sub = (function)GetProcAddress(hm, "sub"); if((add == NULL) || (sub == NULL)) { printf("DLLvscode.dll doesn't export add or sub\n"); } else { int a, b; a = 2; b = 3; printf("%d + %d = %d\n", a, b, add(a,b)); printf("%d - %d = %d\n", a, b, sub(a,b)); } } FreeLibrary(hm); _getch(); return 0; } |
Разберем код функции main(). В начале, загружаем dll-файл (строка 3). В условии if проверяем, успешно ли прошла загрузка (строка 5). Если ничего не загрузилось (значение модуля равно NULL), то выведем сообщение об ошибке (строка 7), если загрузка прошла успешно, то идем далее. Получаем адрес функций add и sub (строки 11-12), проверяем удалось ли получить адреса (14), если не удалось, то выводим сообщение об ошибке (16), если удалось, то двигаемся дальше. Присваиваем значения переменным a и b (строки 21-22), вычисляем значения функций add и sub и выводим результат на экран (23-24). Освобождаем память из под библиотеки (строка 28). Ждем ввода какого-нибудь символа, чтобы консоль мгновенно не закрылась после выполнения приложения (30).
Демонстрация работы программы представлена на рисунке:
Если вы хотите скачать исходник программы, написанной в Visual Studio, то нажмите на кнопку ниже:
Скачать исходник
Поделиться в соц. сетях: