KreuzBlick hat geschrieben: Fr 31. Jul 2020, 18:18
Code: Alles auswählen
library dlltest;
{$mode objfpc}{$H+}
uses
Classes
{ you can add units after this };
function Addieren(x, y: Byte): Word; stdcall;
begin
Result := x + y;
end;
function Subtrahieren(x, y: Byte): ShortInt; stdcall;
begin
Result := x - y;
end;
exports
Addieren index 1,
Subtrahieren index 2;
begin
end.
Die dll stellt zwei Funktionen zur Verfügung, Addieren und Subtrahieren.
Erstmal Anmerkungen für den Pascal Code:
- Verwende cdecl statt stdcall
- Nimm die Typen aus der Unit ctypes (zum Beispiel cuint8 statt Byte), dann kannst du das nämlich leichter mit dem Header für C/C++ abstimmen (siehe unten)
- Lass die index Direktiven weg; Ordinale Importe werden soooo selten gebraucht, dass man das auch einfach vergessen kann
KreuzBlick hat geschrieben: Fr 31. Jul 2020, 18:18
Die will ich jetzt in einem möglichst einfachen C++-Programm ohne weiteren Überbau verwenden, um den Mechanismus zu verstehen. Meine Suche im Internet endet in der Regel bei völlig komplexen Beispielen, die ich dann nicht verstehe. Gibt es dafür auch eine einfache Lösung?
Auch für einen Link, wo das ganze einfach erklärt wird, bin ich natürlich dankbar.
Als erstes brauchst du einen Header für deine Bibliothek. Sowas hier zum Beispiel:
Code: Alles auswählen
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
extern uint16_t Addieren(uint8_t a, uint8_t b);
extern int16_t Subtrahieren(uint8_t a, uint8_t b);
#ifdef __cplusplus
}
#endif
Unter *nix musst du dem Programm dann mitteilen, wo es deine Bibliothek finden kann. In meinem Beispiel: ich habe die Library nach
bin kompliert, mein Quellcode ist in
src und mein aktuellen Verzeichnis ist das Überverzeichnis von beiden. Dann geht es einfach so:
-L ist der Suchpfad für Bibliotheken,
-l ist eine Bibliothek die gelinkt wird (der Linker erweitert das dann zu
libdlltest.so)
Unter Windows musst du eine Importbibliothek generieren. Eigentlich kann dir FPC dabei helfen, aber irgendwie habe ich das gerade nicht zu laufen gebracht, also musst du manuell eine Definitionsdatei (hier
dlltest.def) erstellen:
Das hier ist für x86_64. Für i386 musst du entweder die Exporte in der Bibliothek ändern auf
Addieren name 'Addieren' (das führt aber dazu, dass du unter *nix Probleme bekommst) oder in der Definitionsdatei
_Addieren angeben, da unter Win32 für cdecl Funktionen ein
_ voran gestellt wird (es empfiehlt sich dann zwei Definitionsdateien zu haben).
Aus der Definitionsdatei erzeugst du nun eine Importbibliothek (musst du jedes Mal wachen, wenn sich die Exporte der Bibliothek ändern (also eine Funktion kommt hinzu oder fällt weg), aber nicht, wenn sich nur der Code ändert):
Die finale Binary kannst du nun entweder in Visual Studio generien (dabei die
lib Datei als Linkereingabe angeben) oder über die Kommandozeile (für das aktuelle Beispiel musst du die x64 Umgebung von Visual Studio gestartet haben):
Ich hoffe das hilft dir weiter.