Update

Previous topic - Next topic

Kitty Hello

Was hab ich verschoben? Die Funktionen werden alle mit extern "C" __stdcall exportiert - so wie die Windows API auch.
Ich schau mal, ob ich für GLBasic exporte gleich einen Wrapper miterzeugen lasse, damit man die DLL in ein Projekt integreiren kann. Aber das dauert noch, weil ich z.Zt. privat viel um die Ohren hab und das mit der DLL noch nicht so recht läuft.

trucidare

hmm also wenn ich die dll mit sonem freeware dll export anzeige tool öffne sagt der kein einstiegspunkt gefunden. ich konnte leider nicht mit pe explorer testen der würde das sicherlich finden aber die testversion ist wie gesagt abgelaufen.  aber wenn du sagst es sind normale exports dann werd ich mal weiter testen.
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

Schon mit shift-F8 als DLL erstellt, ja?

Schranz0r

ja und die bringt nichtmal eine Function richtig zurück wie es scheint.

Code (glbasic) Select
FUNCTION Plus: X,Y
    E = X+Y
    RETURN E
ENDFUNCTION
die mit EXPORT Plus und Shift+F8 erstellt

dann mit Declare aufgerufen:

Code (glbasic) Select
INLINE
DECLARE(Plus,"Dll-Test.dll",(int,int),int);
if(Plus>0){
PRINT("GEHT",10,10); // Als test ob se geladen wird
}



LOL = Plus(10,20);

PRINT(LOL, 100,10);
ENDINLINE
Ausgabe ist 20, aber wieso?
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

Hähä! Schreib mal:
Code (glbasic) Select
EXPORT Plusin Dein DLL Projekt.
2. GLBasic Zahlen sind vom Typ "DGInt". (Das ist i.d.R. "double", aber schreib ruhig DGInt).
3. if(Plus>0) könnte falsch sein, wenn er Plus als 'int' vergleicht. Mach: if(Plus) oder if(Plus!=0)
4. Ausgabe ist 20, weil FUNCTION Plus im Projekt ist?

Schranz0r

Ich bin verwirrt o.O

könntest du mal ein kleines Beispiel schreiben mit einer Simplen Function ?
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

trucidare

also:

Code (glbasic) Select
EXPORT Plus

FUNCTION Plus:
    X+Y
ENDFUNCTION
und zum aufruf dann halt die

Code (glbasic) Select
INLINE
    DECLARE(Plus,"Dll-Test.dll",(int,int),DGint);
    if(Plus){
        PRINT("GEHT",10,10); // Als test ob se geladen wird
   



    LOL = Plus(10,20);

    PRINT(LOL, 100,10);
    }
ENDINLINE
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

tft

Hi ..

das ist aber alles ziemlich weit weg von bestehenden Basic Konventionen, Kann man denn da überhaupt noch von einem Basic reden. Siet mir stark nach Obewron aus. Wenn das noch jemand kennt.

Quentin

Oberon? War das nicht mal als Nachfolger von Modula-2 gedacht? Glaube mich dunkel daran zu erinnern.

Aber stimme dir zu. Das ist alles andere als komfortabel. Dieser C++ / Basic-Mischmasch kann mich auch nicht gerade zu Begeisterungsstürmen hinreißen.

Kitty Hello

OK. Bitte einen Vorschlag, wie man solche Funktionen in GLBasic einbinden soll.

Quentin

;) gute Frage

das mit EXPORT für die DLL-Erstellung ist ja schon recht schön einfach.

Das Einbinden wäre idealerweise ebenso einfach möglich, halt GL-like

Beispielsweise mit einem Befehl CALLDLLFUNC

Beispiel:
CALLDLLFUNC(, , (param1, param2, ...))

natürlich auch nicht so schön wegen Parameterliste


Oder als Blockbefehl

BEGINUSEDLL
   FUNCTION blabla(x, y)
   FUNCTION nixnutz()
ENDUSEDLL

nach dieser Deklaration können die Funktionen wie normale GL-Basic-Funktionen genutzt werden.

Kitty Hello

Hmm.. oder:
IMPORT "dllname" funktionsname: param1, param2, ... ?

Zumindest für GLBasic funktionen wäre das gut.

Quentin

jo, IMPORT wäre wohl noch besser, passt dann auch zu EXPORT ;)

wenn man allerdings dadurch wieder zweigleisig fahren müsste mit EXPORT für GL-DLL's und INLINE für C++-DLL's .... wäre nicht so prickelnd IMHO

Kitty Hello

Bei allgemeinen DLLs kommt man um INLINE nicht herum, weil es da eben verschiedene Datentypen gibt, die man u.U. anders gehandhabt haben möchte. Für Newton habe ich z.B. im Hintergrund eine kleine Liste mit Zeigern auf TYPEs gehalten und für die GLBasic Schnittstelle dann den Index in der Liste zurückgegeben.

Aber davon abgesehen, das darf ruhig bisserl kompliziert sein, weil's ja nicht der Normalfall ist.

Quentin

hmmm tja, stimmt auch wieder ... na dann gefiele mir der Vorschlag mit IMPORT noch am besten. Vielleicht hat ja noch jemand andere Ideen.