Wikipedia bietet hier einige Infos
Dynamic Link Library
Hier mal eine schnelle Zusammenfassung mit Beispielen.
Zuerst die DLL und LIB erstellen. Beim kompilieren des folgenden Beispiels, werden mit VC die erfoderlichen Dateien erstellt:
|
C/C++ Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#if defined(_MSC_VER)
#include <windows.h>
#define DLL extern "C" __declspec(dllexport)
#else
#define DLL
#endif
// nur unter MS VC das Symbol DLL definieren; z.B. unter Linux wird DLL ignoriert
// Die Funktion, die anderen Programmen zur Verfügung gestellt werden soll
// (in diesem Beispiel: Addieren zweier Zahlen)
DLL double AddNumbers (double a, double b) {
return a + b;
}
|
Schließlich kann man die DLL auf zwei Arten einbinden.
1) Man bindet die DLL beim Programmstart ein, oder
2) man bindet die DLL während der Laufzeit des Programms ein.
1) Funktion bei Programmstart einbinden mit __declspec(dllimport):
|
C/C++ Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <windows.h>
#include <stdio.h>
// Importieren der Funktion aus der oben erstellten DLL
extern "C" __declspec(dllimport)double AddNumbers (double a, double b);
int main () {
// Aufrufen der externen Funktion
double result = AddNumbers(1, 2);
printf("Das Ergebnis ist: %f\n", result);
return 0;
}
|
2) Man bindet die DLL während der Laufzeit ein und nutzt die Funktionen LoadLibrary, GetProcAddress und schließlich FreeLibrary:
|
C/C++ Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#include <windows.h>
#include <stdio.h>
// Definition der DLL-Funktion, die verwendet werden soll
typedef double (*AddNumbers)(double, double);
int main () {
AddNumbers function;
double result;
// DLL Datei laden
HINSTANCE hinstLib = LoadLibrary("MyDll.dll");
if (hinstLib) {
// Die Einsprungadresse abfragen
function = (AddNumbers) GetProcAddress(hinstLib, "AddNumbers");
// Die Funktion aufrufen
if (function)
result = (*function) (1,2);
// Die DLL-Datei wieder entladen
BOOL fFreeResult = FreeLibrary(hinstLib);
}
// Das Ergebnis anzeigen
if (!hinstLib || !function)
printf("Fehler: Konnte die Funktion nicht aufrufen\n");
else
printf("Das Ergebnis ist: %f\n", result);
return 0;
}
|
Die DLL muss sich im Verzeichnis des Programms befinden.
Sobald die angeforderte DLL nicht vorhanden ist, wird dein OS eine Fehlermeldung ausgeben und das Programm beenden. Der Vorteil biem Einbinden während der Laufzeit ist, dass der Programmierer ggf. Ausnahmen abfangen kann um derartige Programmabstürze zu unterbinden.