Seite 1 von 3
DLL Importer für andere Sprachen
Verfasst: 10.01.2007 14:23
von remi_meier
Hi
Habe dieses
Tool für ein Projekt geschrieben, wird noch erweitert!
Was es macht:
Es liest einen PB-Code mit ProcedureDLLs aus und erzeugt dann daraus
nach Wahl include-Files für die Sprachen C, C++, PB, Blitz. Für C, C++
und PB wird die Import-Lib benötigt, für Blitz nur die DLL.
http://remi.secretly.de/downloads/headergen.exe
Einfach mit /? als Parameter starten.
Viel Spass!
Verfasst: 10.01.2007 15:33
von ts-soft
Danke, sehr nützlich
aber ...
Wenn ich meinen Source "MyDLL.pbi" scanne, ist dieser anschließend futsch
Vielleicht noch eine /OUT parameter oder eine Überprüfung?
Gruß
Thomas
Verfasst: 10.01.2007 16:20
von remi_meier
Oh sorry, werd ich gleich verbessern und wieder hochladen!
Edit: So, wird nun immer "lib" davor geschrieben und eine neue Option
/overwrite hinzugefügt. /out kommt ev. noch.
Verfasst: 10.01.2007 16:39
von ts-soft
Ist ja nichts passiert

, ich teste mit Backups
Wunsch:
Profan Header erstellen: Extension = *.ph
Syntax:
Code: Alles auswählen
FunktionsName(= External("DLLName.dll","FunktionsName",;
EasyRequester(= External("PureBasic.dll", EasyRequester",;
Parameter nicht unbedingt erforderlich, können aber am ende als Bemerkung
angefügt werden, durch ' (Hochkomma) und parameter aufführen.
Es gibt schon ein paar PB-User, die auch Profan oder XProfan verwenden.
Wenns nicht zu schwör ist, bitte *ganzliebguck*
Verfasst: 10.01.2007 16:44
von remi_meier
Ich möchte sowieso so viele Sprachen wie möglich unterstützen. Also wenn
du mir eine genaue Beschreibung aller Datentypen (+Pointer) geben
könntest, sowie diese Beschreibung der Profan-Header etwas genauer
Verrate auch gleich noch ein Geheimnis:
Wenn man vor die Funktion einen Kommentar der Form
; [returntype] = [param1type][param2type][param3type]
stellt, dann kann man den Output genauer definieren:
; void = nichts kommt zurück
; string = Pointer auf einen string / (auf ein Array von Zeichen), 0 Terminierung
; handle = Wenn es unwichtig ist, dass es ein Pointer ist (z. B. beim Objekt "Window")
; byte = signed 1 byte
; char = unsigned 1 bzw. 2 bytes (je nach dem, ob Unicode oder ascii)
; word = signed 2 Bytes
; long = signed 4 Bytes
; quad = signed 8 Bytes
; float = single precision float 4 Bytes
; double = double precision float 8 Bytes
; bool = 1-8 Bytes, darf nur 0 oder 1 sein (egal ob long, byte, quad, etc.)
;
; data = einfach Daten (beliebige Menge)
; struct Name = eine Struktur mit dem Namen 'name' (bis jetzt in PB nur in Verbindung mit 'ptr' erlaubt (byref)): [ptr struct POINT]
;
; ptr Type = eine Adresse, die auf einen Speicher mit dem Typ 'type' verweist (Bsp.: [ptr word][ptr long])
z. B.
; [void]=[long][ptr long]
; [ptr long] = [string][char]
das geht deshalb, weil man das in PB nicht immer genau so genau definieren
kann

Verfasst: 10.01.2007 17:04
von ts-soft
remi_meier hat geschrieben:Ich möchte sowieso so viele Sprachen wie möglich unterstützen. Also wenn
du mir eine genaue Beschreibung aller Datentypen (+Pointer) geben
könntest, sowie diese Beschreibung der Profan-Header etwas genauer
Ist nicht viel
Code: Alles auswählen
Text$ = string
Zahl& = long
Fließkommazahl! = double
Bereich# = pointer (memoryvariable)
PB Beispiel: (PureBasic.dll)
Code: Alles auswählen
ProcedureDLL Test(a.l, b.s, c.f)
ProcedureReturn a
EndProcedure
Ergibt:
Code: Alles auswählen
Test(= External("PureBasic.dll", "Test",; ' a&, b$, c!, Ergebnis long
Wobei die Parameter sowieso nur als Kommentar angegeben werden, also
für die Header-Datei nur informativen Wert haben.
Es gibt auch noch inc-Dateien in Profan, da wäre es etwas komplizierter,
aber Header in dieser Form sollten erstmal reichen.
Der Profancompiler findet "~Test" und ersetzt durch den Text bis zum ";"
dahinter kommen dann vom Progger die weiteren Parameter, sowie die fehlende Klammer

Ist also wirklich nicht mehr erforderlich. Ich denke die Header-Dateien
sollten am unkompliziertesten sein.
Gruß
Thomas
// Nachtrag:
Bei Funktionen ohne Parameter, ist das komma vorm ; wegzulassen, das
komma sagt, da kommt noch was

Verfasst: 10.01.2007 17:42
von remi_meier
Ok, ist dann ja ähnlich wie BlitzBasic.
Nur, gibt es da einen essenziellen Unterschied zwischen # und & ? Muss
wissen, wann ich da unterscheiden sollte, aber da das ja eh nur Makro-
mässig abläuft, spielt es keine Rolle.
Kann ich dem Rückgabewert keinen Typ geben?
Werd das mal versuchen. Wenn du noch einen guten Link für inc-Dateien
hast, würde ich mir das auch gerne mal anschauen!
Verfasst: 10.01.2007 17:51
von ts-soft
Guck mal auf Andreas seine Seite:
http://www.ampsoft.eu/tools/codes.php
Bei den Tools brauchste DLL nur draufdroppen und er generiert. Dann siehste
wie es aussieht. Die inc haben den Vorteil, das die Anzahl der Parameter
ersichtlich ist. Diese Form des Def wird aber irgendwann nicht mehr
Unterstützt.
Ergebnise sind immer Long, müssen umgemünzt werden. Strings dürfen
direkt in Literalen übergeben werden, ansonsten mit der Addr Funktion,
entspricht @ in PB. Deswegen reichen einfach Kommentare für die
Parameter. Den Rest muß der Profaner selber hinkriegen
Gruß
Thomas
Verfasst: 10.01.2007 18:03
von remi_meier
Ok, nun noch drei Sachen zum sicher gehen:
Kommentare beginnen mit ;?
Es sind wirklich doubles und keine floats?
Ich hoffe, es ist stdcall

Verfasst: 10.01.2007 18:15
von ts-soft
Kommentare beginne mit hochkomma ' wie in VB u.a.
Das Semikolon ist das Ende für den Kompiler. Hochkomma dahinter und kommentare schreiben
Profan kennt nur Double. Kleinere Fließkommazahlen gibts nicht. Dafür gibts
leider keine Quad.
Profan kann nur stdcall DLLs lesen, bei den anderen spreizt er die Flügel
