Створення і використання динамічно підключаються бібліотек (dll)

Створення і використання DLL
(Microsoft Visual C ++)

Створити DLL набагато легше, ніж ви думаєте. Бібліотеки DLL дуже корисні, якщо ви програмуєте під Windows. У цих бібліотеках зазвичай зберігають часто використовувані підпрограми. У статті розповідається як створити просту DLL і показано, як викликати функції, що містяться в ній. Приклади розраховані на використання Microsoft Visual C ++ 6.0, але неважко перевести їх на будь-який діалект C ++.

створення DLL

Нічого особливого тут немає. Як завжди, ви просто пишіть функції, як в звичайній програмі. Якщо ви використовуєте MSVC, створіть новий проект і вкажіть, що ви створюєте Win32 Dynamic-Link Library. Після компіляції ви отримаєте DLL, бібліотеку імпорту (.lib) і бібліотеку експорту (.exp). Далі показаний приблизний код вашої DLL:

Заголовки (DLLTEST.H)

#ifndef _DLLTEST_H_
#define _DLLTEST_H_

#include
#include
#include

extern "C" __declspec (dllexport) void NumberList ();
extern "C" __declspec (dllexport) void LetterList ();

Код бібліотеки (DLLTEST.CPP)

#define MAXMODULE 50

extern "C" __declspec (dllexport) void NumberList ()
GetModuleFileName (NULL, (LPTSTR) module, MAXMODULE);
cout <<"\n\nThis function was called from "
< < cout <<"NumberList(): ";
for (int i = 0; i<10; i++)
cout <>
cout <>

extern "C" __declspec (dllexport) void LetterList ()
GetModuleFileName (NULL, (LPTSTR) module, MAXMODULE);
cout <<"\n\nThis function was called from "
< < cout <<"LetterList(): ";
for (int i = 0; i<26; i++)
cout <>
cout <>

Як бачите, нічого особливого в коді немає. Додаток, що використовується для прикладу - консольне, так що тут просто запрограмовані дві функції, які виведуть текст. рядок

extern "C" __declspec (dllexport)

означає, що функція буде видна поза DLL (тобто її можна викликати з нашої програми).
Після компіляції ми отримаємо бібліотеку. Тепер посммотрім, як її можна використовувати.

Використання DLL (з бібліотекою імпорту)

Спочатку подивимося, як використовувати DLL разом з бібліотекою імпорту (dlltest.lib), яка виходить при компіляції попереднього прикладу. Цей метод дуже простий, так як в такому випадку потрібно просто включити заголовний файл бібліотеки і саму бібліотеку в проект. приклад:

Вихідний файл програми, що використовує бібліотеку DLL (DLLRUN01.EXE)

#include
#include

void main ()
NumberList ();
LetterList ();

Це буде чудово працювати, якщо у вас є заголовки і бібліотека імпорту (dlltest.lib) знаходиться в каталозі, прописаному в бібліотечних шляхах. Перед запуском програми, переконайтеся, що DLL знаходиться в каталозі, прописаному в системній змінній PATH або в тому ж каталозі, що і виконуваний файл, інакше ви отримаєте повідомлення про помилку. Однак якщо 10 програм використовують цю DLL, вам потрібна всього одна її копія, що лежить, наприклад, в каталозі Windows \ System.

Результати роботи DLLRUN01.EXE

This function was called from C: \ DLLTEST \ DLLRUN01.EXE
NumberList (): 0 1 2 3 4 5 6 7 8 9

This function was called from C: \ DLLTEST \ DLLRUN01.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

Використання DLL без бібліотеки імпорту

Тепер подивимося, як завантажити DLL "на льоту". Це потрібно в разі, якщо не ви розробляли цю DLL і у вас немає заголовки і бібліотеки імпорту.

Вихідний файл програми, що використовує бібліотеку DLL - консольний додаток Win32 (DLLRUN01.EXE)

#include
#include
#include
#include

#define MAXMODULE 50

typedef void (WINAPI * cfunc) ();

cfunc NumberList;
cfunc LetterList;

void main ()
HINSTANCE hLib = LoadLibrary ( "DLLTEST.DLL");
if (hLib == NULL)
cout <<"Unable to load library!" < getch ();
return;
>

GetModuleFileName ((HMODULE) hLib, (LPTSTR) mod, MAXMODULE);
cout <<"Library loaded: " < NumberList = (cfunc) GetProcAddress ((HMODULE) hLib, "NumberList");
LetterList = (cfunc) GetProcAddress ((HMODULE) hLib, "LetterList");
if ((NumberList == NULL) || (LetterList == NULL))
cout <<"Unable to load function(s)." < FreeLibrary ((HMODULE) hLib);
return;
>
NumberList ();
LetterList ();
FreeLibrary ((HMODULE) hLib);
getch ();
>

Результати роботи 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

висновок

Звичайно, ці невеликі приклади далекі від реальних завдань програміста, проте вони цілком достатні, щоб зрозуміти основні принципи створення і використання DLL. Напишіть, якщо ви знайшли помилки або неточності. Завантажити вихідні тексти програм, що використовуються в статті, можна звідси.

Схожі статті