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