Створення і використання 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 "
<
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 "
<
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!" <
return;
>
GetModuleFileName ((HMODULE) hLib, (LPTSTR) mod, MAXMODULE);
cout <<"Library loaded: " <
LetterList = (cfunc) GetProcAddress ((HMODULE) hLib, "LetterList");
if ((NumberList == NULL) || (LetterList == NULL))
cout <<"Unable to load function(s)." <
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. Напишіть, якщо ви знайшли помилки або неточності. Завантажити вихідні тексти програм, що використовуються в статті, можна звідси.