Створюємо і підключаємо DLL, C / C + +, Програмування, статті

CodeNet

Створюємо DLL


Зараз ми розглянемо для чого потрібні DLL (Dynamic Link Library – динамічно компануемая бібліотека) і як їх створювати. DLL-це ділянка коду зберігається у файлі з розширенням. Dll. Код може бути використаний іншими програмами, але сама посебе бібліотека прорамми не є. Вобщем-то, динамічно компонованих бібліотеки є наба скомпілірованниих функцій. Але у ютіх бібліотек є свій особливості, так наприклад, якщо каккіето дві або більше програми для Windows одночасно виконуються і використовують функції, що знаходяться в одній DLL, то в пам’яті буде постійно знаходиться тільки одна бібліотека, забезпечуючи тим самим економне витрачання пам’яті. Завантаження бібліотеки в пам’ять може бути статичною і динамічною.

При статичної завантаженні DLL автоматично завантажується при запуску ісользующего її застосування. Така DLL містить експортовані функції, опис яких знаходиться у файлі бібліотеки імпорту (import library file -. lib). Для використання статичної завантаження ви повинні на етапі компоновки до програми додключіть. Lib файл вашої DLL. У C + + Builder це зводиться до включення в проект. Lib файлу через менджер проектів.

При динамічні завантаженні ви можете завантажувати DLL при необхідності, вивантажити її когода вона непотрібна. Проте працювати з такими бібліотеками складніше ніж зі статичними.Розглянемо соззданіе і використання DLL статичної завантаження.


Статична завантаження

Створимо спершу проект (File / New / DLL). Буде створений проект, що містить наступне:


int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) {
return 1;
}

і довгий коментар застережливий вас про те, що для работо здібності вашої DLL необхідно снеі забезпечити поствку деяких dll якщо ви використовуєте екземпляри класу String.

Для експорту та імпорту з DLL необхідно використовувати моди фікатори __export і __import відповідно. Але в C + + Builder можна використовувати нове ключове слово __delspec () з параметрами dllexport і dllimport відповідно. Самі розумієте, що для того щоб еспортіровать функції з бібліотеки еужен один заголовний файл з описами _delspec (dllexport) для експортованих функцій, для імпорту функцій у додаток вам необхідно буде поставити анологичних заголовний файл але з _delspec (dllimport) описами, що досить незручно. Ця проблема вирішується легко: додайте в заголовний файл бібліотеки наступне:


#if defined(BUILD_DLL)
# define DLL_EXP __declspec(dllexport)
#else
# if defined(BUILD_APP)
# define DLL_EXP __declspec(dllimport)
# else
# define DLL_EXP
# endif
#endif

у вихідному файлі DLL напишіть # define BUILD_DLL, а замість __declspec (dllexport) пишіть DLL_EXP. При написанні програми добавте рядок # define BUILD_APP, і просто підключіть заголовний файл DLL.


Приклад DLL: файл P.cpp


//—————————————————————————
#define BUILD_DLL
#include
#include “p.h”
#pragma hdrstop

//—————————————————————————
// Important note about DLL memory management when your DLL uses the
// static version of the RunTime Library:
//
// If your DLL exports any functions that pass String objects (or structs/
// classes containing nested Strings) as parameter or function results,
// you will need to add the library MEMMGR.LIB to both the DLL project and
// any other projects that use the DLL. You will also need to use MEMMGR.LIB
// if any other projects which use the DLL will be perfomring new or delete
// operations on any non-TObject-derived classes which are exported from the
// DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
// EXE’s to use the BORLNDMM.DLL as their memory manager. In these cases,
// the file BORLNDMM.DLL should be deployed along with your DLL.
// To avoid using BORLNDMM.DLL, pass string information using “char *” or
// ShortString parameters.
//
// If your DLL uses the dynamic version of the RTL, you do not need to
// explicitly add MEMMGR.LIB as this will be done implicitly for you
//————————————————————————-
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) {
return 1;
}

//————————————————————————-

void Message(char *s) {
i=10;
Application->MessageBox(s,”From DLL”,IDOK);
}


Файл P.h


#if defined(BUILD_DLL)
# define DLL_EXP __declspec(dllexport)
#else
# if defined(BUILD_APP)
# define DLL_EXP __declspec(dllimport)
# else
# define DLL_EXP
# endif
#endif

DLL_EXP void Message(char *s);
DLL_EXP int i;


Скомпілюйте проект.


Якщо ви натиснете Run то після завершення побудови буде видано повідомлення що дана програма не можнт бути виконана (природно).Тепер напишемо зухвалу програму. Втомже каталозі создайде новий проект (File / New Application) в форму помістіть одну кнопку і створи обробник події OnClick. Ваш виконуваний файл повинен представляти собою слдующее:


//—————————————————————————
#include
#define BUILD_APP
#pragma hdrstop
#include “p.h”
#include “Unit1.h”
#include
//—————————————————————————
#pragma package(smart_init)
#pragma resource “*.dfm”
TForm1 *Form1;
//————————————————————————-
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}

//————————————————————————-
void __fastcall TForm1::Button1Click(TObject *Sender) {
char c[10];
Message(“roma”);
for( ; i>0;i–) {
sprintf(c,”Example %d”,i );
Application->MessageBox(“Example of using DLL variable”,(char*)c,IDOK);
}
}

//————————————————————————-


Не забудьте про об’яви на початку файлу. Зайдіть в менеджер проектов.Там відкрийте свій проект і додайте. Lib файл з Попереднє проект з DLL (правий клік, пункт ADD). Запустіть проект.

Як бачите, для того, щоб вашу DLL можна було використовувати необхідно три файли: сама DLL, заголовний файл і бібліотечний файл. Lib.

Динамічне завантаження

Динамічне завантаження горазда складніше. Однак для динамічного завантаження потрібно тільки сама DLL (непотрібною ні. Lib ні заголовний файл, хоча його можна ісполбзовать для опису експортованих функцій для предполагемого користувача).


Давайте розглянемо на прикладі, як здійснюється динамічне завантаження. Створіть новий прокто DLL і внесіть до нього таке:



extern “C” void __export Message(char *s) {
Application->MessageBox(s,”From DLL”,IDOK);
}

Cкомпіліруйте проект, в результаті чого буде створена DLL.

Тепер створіть проект програми анологичних проекту для використання статичної завантаження (форма з кнопкою і обробником події кнопки OnClick) нижче наведено код програми: (Unit11.cpp)


//—————————————————————————
#include
#pragma hdrstop
#include “Unit11.h”
#include
//—————————————————————————
#pragma package(smart_init)
#pragma resource “*.dfm”
TForm1 *Form1;
//—————————————————————————
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}
//—————————————————————————

void __fastcall TForm1::Button1Click(TObject *Sender) {
void (__stdcall *Message)(char *s);
HINSTANCE dllp = LoadLibrary(“p.dll”);
if (dllp) {
Message= (void(__stdcall *) (char*))
GetProcAddress(dllp, “_Message”);
if (Message) Message(“Hi From Dinamic DLL”);
}
FreeLibrary(dllp);
}
//—————————————————————————

запустіть це проект, при натисканні на кнопку повинно видаватся сообшеніе. Тепер розберемося, як це працює.



  • void (__stdcall *Message)(char *s);-Оголошення покажчика на функцію.
  • HINSTANCE dllp = LoadLibrary(“p.dll”);– Завантаження бібліотеки в пам’ять.
  • Message= (void(__stdcall *) (char*)) GetProcAddress(dllp, “_Message”); присвоєння вказівником адреси функції DLL.
  • Message(“Hi From Dinamic DLL”); робочий виклик фунції (власне то для чого все це і робиться).
  • FreeLibrary(dllp);– Вивантаження бібліотеки з пам’яті.

Зверніть увагу на те, що прізагрузке можна вказати точне местоположніе бібліотеки (необезательно в тому ж каталозі де і додаток).

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*