Ich werde euch hier eine Anleitung geben, mit deren Hilfe ihr euch mit einem kostenlosen C++ Compiler
eigene DLLs kompilieren und sie dann in Purebasic benutzen könnt.
Compiler installieren
Okay, dann mal los. Als erstes müsst ihr euch natürlich den Compiler runterladen und installieren.
Verwenden werden wir den kostenlosen MinGW Compiler der auf dem bekannten GCC Compiler
für Linux basiert. Allerdings nehmen wir hierzu nicht das offizielle MinGW Paket, da dieses schon
ziemlich alt ist. Es gibt aber einen inoffiziellen Installer, der viel öfter aktualisiert wird.
Um den zu finden geht ihr auf http://www.tdragon.net/recentgcc. Scrollt etwas herunter und ihr
werdet unter "download" den Bundled Installer finden (in meinem Fall "tdm-mingw-1.905.0-4.4.0-2.exe").
Ladet diese Datei runter und führt sie aus. Klickt auf "Create" und wählt das Verzeichnis.
Dann müsst ihr den gewünschten Sourceforge Mirror Server auswählen. Bei der Komponentenwahl
behaltet einfach die Standardauswahl bei und klickt auf "Install".
Der Code
Nachdem wir also den Compiler installiert haben, brauchen wir jetzt noch Code den wir kompilieren wollen.
Nehmt am besten für den Anfang erst mal Notepad bis ihr die Grundzüge des Kompilier- und Linkablaufs
von C++ verinnerlicht habt. Danach könnt ihr dann eine der vielen IDEs verwenden, da wird vieles einfacher.
So, dann schreiben wir mal eine kleine DLL in C++. Hier ist der Code, ich werde gleich noch alles dazu erklären:
Code: Alles auswählen
#include <fstream>
#include <string>
using namespace std;
#define EXPORT extern "C" __declspec(dllexport)
EXPORT int CountLines(const char* filename) {
ifstream file(filename);
int lineCount = 1;
string line;
while(getline(file, line)) {
lineCount++;
}
return lineCount;
}
bloß wie ich die Funktion CountLines deklariert habe. Ich habe das Makro EXPORT definiert, welches zwei wichtige
Dinge festlegt. Das extern "C" sagt dem Compiler, dass er den Funktionsnamen nicht nach den C++ Regeln benennen soll.
So wird der Funktionsname, wie in C üblich, einfach so übernommen, und wir können später mit Purebasic einfacher
darauf zugreifen. Das __declspec(dllexport) sagt dem Compiler, dass er die Funktion exportieren soll, damit sie nach
außen hin sichtbar wird (wie das ProcedureDLL in Purebasic).
Okay, jetzt speichert die Datei in einem leicht von der Console aus zugänglichen Ordner (Ich nenne sie "dll.cpp").
Der Compiler
So, jetzt werden wir die Datei kompilieren. Geht ins Startmenu -> MinGW -> MinGW Command Prompt. Das sollte ein
Konsolenfenster öffnen. Wechselt in das Verzeichnis, in dem ihr die dll.cpp abgespeichert habt (mit "cd <Ordner>").
Jetzt führt ihr diese zwei Befehle aus:
Code: Alles auswählen
g++ -c dll.cpp
g++ -shared -o TestDll.dll dll.o
ist der eigentliche Maschinencode enthalten, allerdings sind die Abhängigkeiten noch nicht aufgelöst, das heißt die
Funktionen der Standard Bibliothek sind noch nicht dazu gelinkt. Das erledigt jetzt der zweite Befehl. Damit haben wir
unsere DLL endlich erhalten.
Purebasic
Um jetzt unsere neu erstellte DLL unter Purebasic verwenden zu können, müssen wir sie mit den Befehlen der Library
Bibliothek öffnen, und können dann auf die Funktionen zugreifen. Ich verwende hier Prototypen, falls ihr damit nichts
anfangen könnt, lest euch am besten die Seiten dazu in der Purebasic Hilfe durch. Hier ist der Code:
Code: Alles auswählen
;Der Prototyp für unsere Funktion in der DLL
PrototypeC ProtoCountLines(Filename.s)
;Die DLL öffnen
If Not OpenLibrary(0, "TestDll.dll")
End
EndIf
;Eine globale Instanz unseres Prototypes, dem die Addresse der Funktion in der DLL zugewiesen wird
Global CountLines.ProtoCountLines = GetFunction(0, "CountLines")
;Einfach aufrufen, heraus kommen sollte die Anzahl der Zeilen unserers C++ Codes
Debug CountLines("dll.cpp")
;Library schliessen (macht Purebasic auch automatisch nach Beenden des Programms)
CloseLibrary(0)
Mit der hier gezeigten Methode könnt ihr doch recht einfach DLLs in C++ schreiben. Wenn der Code aber dann
umfangreicher wird, empfiehlt es sich eine IDE zu nutzen. Ich schlage hierzu CodeBlocks vor (www.codeblocks.org).
CodeBlocks ist kostenlos, erkennt fast alle Compiler automatisch und hat alle wichtigen Eigenschaften einer IDE.
Wenn ihr noch Fragen habt, dann fragt einfach. Verbesserungsvorschläge und Kritik sind erwünscht.