Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP / BorlandC++Builder1.doc
Скачиваний:
76
Добавлен:
20.02.2016
Размер:
1.68 Mб
Скачать

Динамическая загрузка

Динамическая загрузка горазда сложнее. Однако для динамической загрузки требуется только сама 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);- выгрузка библиотеки из памяти.

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

Соседние файлы в папке OOP