- BCB starten und im Menü ‚Datei->Neu->DLL Experte‘ wählen
- BCB erstellt nun das Grundgerüst einer DLL (Unit1.cpp):
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
// Wichtiger Hinweis über die DLL-Speicherverwaltung, falls die DLL die statische
// Version der Laufzeitbibliothek (RTL) verwendet:
//
// Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/
// Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt,
// muß die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten,
// die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann,
// wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen
// auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert
// werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs
// angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall
// sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden.
//
// Um die Verwendung von BORLNDMM.DLL, zu vermeiden, solten String-Informationen als "char *" oder
// ShortString-Parameter weitergegeben werden.
//
// Falls die DLL die dynamische Version der RTL verwendet, müssen Sie
// MEMMGR.LIB nicht explizit angeben.
//---------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
- Wir ändern den Quellcode dahingehend, dass er wie folgt aussieht (Kommentare entfernen):
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
- Jetzt fügen wir zwei Beispielfunktionen und die entsprechenden Export-Deklarationen ein:
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
// Funktionen für Export zur späteren Anwendung deklarieren
extern "C" __declspec(dllexport) int Addieren(int, int);
extern "C" __declspec(dllexport) void Addieren_mit_Pointer(int *, int*, int*);
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
// Funktion zur einfachen Addidtion zweier Zahlen
int Addieren(int Zahl1, int Zahl2)
{
return Zahl1+Zahl2;
}
// Funktion zur Addition zweier Zahlen über Pointer
void Addieren_mit_Pointer(int *Zahl1, int *Zahl2, int *Ergebnis)
{
// Die Summe der Pointer Zahl1 und Zahl2 an den Pointer Ergebnis übergeben
*Ergebnis=*Zahl1+*Zahl2;
}
- DLL mit Menüpunkt ‚Projekt->Projekt erzeugen‘ generieren
- Das zugehörige Beispielprogramm (Projekt1.bpr), welches die DLL verwendet, sieht dann wie folgt aus (das Einbinden der *.lib-Datei nicht vergessen!! [siehe Eine DLL in ein BCB Projekt einbinden]):
//---------------------------------------------------------------------------
// Das Beipielprogramm verwendet zwei Buttons und drei Editfelder
//
// Edit1: Zahl1
// Edit2: Zahl2
// Edit3: Ergebnis
// Button1: Zahl1 + Zahl2 = Ergebnis
// Button2: *Zahl1 + *Zahl2 = *Ergebnis
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// Funktionen, die aus der DLL importiert werden
extern "C" __declspec(dllimport) int Addieren(int, int);
extern "C" __declspec(dllimport) void Addieren_mit_Pointer(int *, int*, int*);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int Ergebnis;
// DLL-Funktion aufrufen, Rückgabewert ist vom Typ int
Ergebnis = Addieren(Edit1->Text.ToInt(), Edit2->Text.ToInt());
Edit3->Text = IntToStr(Ergebnis);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int* Zahl1 = new int;
int* Zahl2 = new int;
int* Ergebnis = new int;
*Zahl1 = Edit1->Text.ToInt();
*Zahl2 = Edit2->Text.ToInt();
// DLL-Funktion aufrufen
// Summe von *Zahl1, *Zahl2 steht in *Ergebnis
Addieren_mit_Pointer(Zahl1, Zahl2, Ergebnis);
Edit3->Text = IntToStr(*Ergebnis);
delete Zahl1;
delete Zahl2;
delete Ergebnis;
}