Пример создания и работы с 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)в исходном файле DLL напишите #define BUILD_DLL, а вместо __declspec(dllexport) пишите DLL_EXP.
# else # define DLL_EXP # endif #endif
При написании программы добавте строчку #define BUILD_APP, и просто подключите заголовочный файл DLL.
Пример DLL: файл P.cpp
//------------------------------------------------
#define BUILD_DLL
#include "p.h"
#pragma hdrstop
//-------------------------------------------------
// здесь будет много текста
//-------------------------------------------------------------------------
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"
//-----------------------------------------------------
#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)
//--------------------------------------------
#pragma hdrstop
#include "Unit11.h"
//---------------------------------------------
#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 Dynamic DLL");
}
FreeLibrary(dllp);
}
//----------------------------------------------
запустите это проект, при нажатии на кнопку должно выдаватся сообщение.
Теперь разберемся, как это работает.
Обратите внимание на то, что при загрузке можно указать точное местоположние
библиотеки (необезательно в том же каталоге где и приложение).
Информация о статье "Пример создания и работы с DLL"
DeVoid |
http://devoid.com.ua |
26 Августа 2007 |
Просмотрели 4689 раз
КОММЕНТАРИИ
Комментариев еще нет.
Зарегистрируйтесь или выполните Вход для того чтобы оставлять комментарии
Не менее интересно
- Сохранение настроек программы в реестре
- Как использовать анимированный курсор в C++Builder
- Загрузить и сохранить настройки программы с помощью INI-файлов
- Массивы. Введение в массивы для начинающих.
- Работа с Системным реестром в C++ Builder (Класс TRegistry)
- Перехват системных сообщений когда программа неактивна
- Работа с графиками и диаграммами (TChart, Series)
- Как создать удобный интерфейс программы
- Как продать свою программу
- Вызов WinApi функций из C++Builder


