wrapper einer .dll schreiben

Previous topic - Next topic

Heiko

Also eins gleich vorweg, ja ich will mich an eine dll wagen, welche eine 3D Engine beinhaltet, aber keine Konkurenz zur glb internen, da diese dx9 unterstützen wird.

Meine Frage nun, ich habe die header datei von purebasic angesehen, sowie die von bb3d, welche beide die dll unterstüzen.

Wie müsste so ein wrapper für glb aussehen?

einzelne funktionen mit jeweils inline drin?
und es gibt eine Init3D und die dazugehörige EndInit3d(welche die dll aus dem speicher entlädt) funktion.
die Init3D() umfasst in den anderen headerdateien den kompletten befehlssatz der dll.
ich habe somit erstmal versucht eine funktion um alle anderen funktion zu machen, hat aber nicht wirklich geklappt.

also grundlegen eine frage, wie kann man in einer gbas eine dll aufrufen, und alle, befehle nutzbar machen?
bei den anderen header dateien gibt es ja sowas wie die prototypen, und deklarationen, constanten usw.

wie müsste das bei glb aussehen?

ich könnte auch einen teil der pb headerdatei posten, falls euch das etwas nützt?

frage ist auch, wenn ich in der dll beispielsweise einen befehl wie positionentity(entity, x, y, z) aufrufen würde wollen, was für werte bzw. variablen oder variablentypen ich dort eintragen muss?
also x,y,z sind ja integer, und entity, wohl dann eher nicht, oder wird das intern ebenso als integer gehandhabt.

es sind mehrere hundert befehle, aber ich würde das einfach mal nebenbei stück für stück probieren wollen, bzw. mal einfach nur ein objekt laden und anzeigen wollen, mit dx9 und glb.
das ist ein riesen motivationsschub.

für tips etc. wie man das anhand eines beispiels macht, wäre ich mehr als dankbar.

Kitty Hello

http://www.glbasic.com/forum/index.php?topic=2129.0 zeigt wie's geht. Evtl. sollte das mal einer übersetzen und in's deutsche FAQ packen. - aber sprecht euch ab, damit's nicht 3 gleichzeitig machen :P

Heiko

#2
jo, da warst du wohl etwas zu schnell.
aber geht das nicht simpler???

die pb headerdatei sieht so aus, hab sie dir schon geschickt, aber wer sich angesprochen fühlt, und wenigstens anhand eines befehls, oder zwei oder drei, das mal übersetzen könnte.

http://www.glbase.de/dll.txt


also so gehts es ja schonmal nicht.....

Code (glbasic) Select
FUNCTION xGraphics3D: a, b, c, d, e
INLINE
DECLARE_ALIAS(xGraphics3D,"Xors3D.dll","_xGraphics3D@20",(int,int,int,int,int),int);
ENDINLINE
ENDFUNCTION


FUNCTION xCreateCamera:
INLINE
extern "C" {
DECLARE_ALIAS(xCreateCamera,"Xors3D.dll","_xCreateCamera@4",(),void);
}
ENDINLINE
ENDFUNCTION

FUNCTION xflip:
INLINE
extern "C" {
DECLARE_ALIAS(xFlip,"Xors3D.dll","_xFlip@0",(),void);
}
ENDINLINE
ENDFUNCTION

FUNCTION xPositionEntity: ent, x,y,z
INLINE
extern "C" {
DECLARE_ALIAS(xPositionEntity,"Xors3D.dll","_xPositionEntity@20",(int,int,int),void);
}
ENDINLINE
ENDFUNCTION


Kitty Hello

Nein!!! Das DECLARE kommt oben in die Datei und nicht in eine Funktion. Schau halt mal mein Beispiel an und lies das auch durch.

Heiko

#4
kannst du wenigstens einen oder zwei meiner beispielbefehle oben umschreiben?
vorallem die übergebenen parameter machen mir probleme, weil ja ein unterschied zwischen zahlen, entitys, true-false, etc. ist.

ich bin da bei deinem noch net ganz durchgestiegen, dachte da reicht eine oder zwei zeilen um das umzuschreiben.

okay schau mal, so in etwa? 

Code (glbasic) Select
INLINE
extern "C" {
DECLARE_ALIAS(xGraphics3D,"Xors3D.dll","_xGraphics3D@20",(int,int,int,int,int),int);
}
ENDINLINE

FUNCTION Graphics3D: width, height, depth, mode, vsync
INLINE
  if(xGraphics3D)
     return xGraphics3D(0);
ENDINLINE
ENDFUNCTION


kommt aber dieser fehler.

Code (glbasic) Select
compiling:
C:\Users\nutzer\AppData\Local\Temp\glbasic\gpc_temp1.cpp: In function `DGInt __GLBASIC__::Graphics3D(DGInt, DGInt, DGInt, DGInt, DGInt)':
C:\Users\nutzer\AppData\Local\Temp\glbasic\gpc_temp1.cpp:18: error: too few arguments to function
*** FATAL ERROR - Bitte die Compiler-Ausgabe ins Forum kopieren
_______________________________________


ps.s der prototype bei pb lautet
Code (glbasic) Select
Prototype.l xGraphics3DProto(width, height, depth = 32, mode = #False, vsync = #False)

Das #False bei den beiden Parametern bedeutet, dass diese, falls an ihrer Position im Funktionsaufruf kein Wert eingegeben wird, standartmäßig den Wert #False annehmen. Es sind quasi "optionale Parameter".
WIE muss ich das handhaben???

und der bb3d part wäre folgender

in der decls datei
Code (glbasic) Select
DLL_xGraphics3D%(width%, height%, depth%, mode%, vsync%):"_xGraphics3D@20"
und in der header datei die funktion
Code (glbasic) Select
Function xGraphics3D(width, height, depth = 16, mode = 0, vsync = 0)
hwnd = SystemProperty("AppHWND")
xSetWND(hwnd)
DLL_xGraphics3D(width, height, depth, mode, vsync)
xDefaultFont = xLoadFont("Arial")
End Function


vielleicht hilft das ja, ich blick nämlich nicht, warum da zu wenig argumente übergeben werden!?!


is schon blöd, dass man bei glb nicht den gleichen funktionsnamen nehmen kann.

Heiko

Code (glbasic) Select
INLINE
extern "C" {
DECLARE_ALIAS(xGraphics3D,"Xors3D.dll","_xGraphics3D@20",(int,int,int,int,int),int);
}
ENDINLINE

FUNCTION Graphics3D: width, height, depth = 16, mode = 0, vsync = 0
INLINE
  if(xGraphics3D)
     return xGraphics3D(width, height, depth, mode, vsync);
ENDINLINE
ENDFUNCTION

INLINE
extern "C" {
DECLARE_ALIAS(xRenderWorld,"Xors3D.dll","_xGraphics3D@4",(int),int);
}
ENDINLINE

FUNCTION Render3D:
INLINE
  if(xRenderWorld)
     return xRenderWorld(0);
ENDINLINE
ENDFUNCTION


soweit funktioniert das, bricht aber damit ab, dass die meldung kommt, das die direct3d device nicht gestartet werden kann.

dazu gibts in der pb header datei um alle global deklarationen bzw. funktionen eine große funktion namens INIT3D() .wie bekomm ich das in glb hin.

Schranz0r

#6
wollte grad schreiben, dass der das Device nicht erstellen kann!
Liegt wohl an der DLL....

Mein Code(Seperates *.gbas):

Code (glbasic) Select
GLOBAL xDefaultFont

INLINE

#define DLL "Xors3d.dll"

DECLARE_ALIAS(xSetWND, DLL,"_xSetWND@4",(void*),void);
DECLARE_ALIAS(xGraphics3D, DLL, "_xGraphics3D@20",(int,int,int,int,int),int);
DECLARE_ALIAS(xLoadFont, DLL, "_xLoadFont@20",(const char,int,int,int,int),int);
// DECLARE_ALIAS(, DLL, "",(),);
// DECLARE_ALIAS(, DLL, "",(),);
// DECLARE_ALIAS(, DLL, "",(),);
// DECLARE_ALIAS(, DLL, "",(),);
// DECLARE_ALIAS(, DLL, "",(),);
// DECLARE_ALIAS(, DLL, "",(),);
// DECLARE_ALIAS(, DLL, "",(),);
// DECLARE_ALIAS(, DLL, "",(),);
// DECLARE_ALIAS(, DLL, "",(),);


ENDINLINE


FUNCTION Xo_Graphics3D: width, height, depth = 16, mode = 0, vsync = 0
LOCAL OK

INLINE
xSetWND(GLBASIC_HWND());
OK = xGraphics3D(width, height, depth, mode, vsync);
ENDINLINE

xDefaultFont = Xo_LoadFont("Arial");
RETURN OK
ENDFUNCTION

FUNCTION Xo_LoadFont: font$, height = 12, bold = 0, italic = 0, underline = 0
INLINE
return xLoadFont(font_Str, height, bold, italic, underline);
ENDINLINE
ENDFUNCTION


EDIT:

Die INIT vom PB-Header ist nur dafür da, alle Funktionen zu laden mehr net ;)

EDIT2:

Das komische ist noch er sagt fehler in:
File name: e:\xors\xors3d\engine\render.cpp

Ich hab "e" als DVD-Laufwerk :D
KA was der von dem render.cpp will?
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

Heiko

#7
kannst du die xRenderWorld noch machen?
und irgendwas mit entities?also weil ich nicht weiß, was da hinten dann reinkommt, jeweils, int, void, oder was auch immer.

das xRenderworld hab ich wohl falsch....

das mit dem laufwerk pfad hab ich auch, keine ahnung warum?

Heiko

#8
ups, stimmt, Fehler in der declare, war noch das xGraphics3D@4 drin.geht aber trotzdem noch nicht, keine ahnung warum.

Schranz0r

vergiss es einfach, wirds beste sein ;)
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

Heiko

#10
na toll

kannst du dir trotzdem die pb datei nochmal anschauen?
da wird am anfang ein Xors3D_Init()
gezeigt, welches alles umfasst als funktion.

und in einem pb beispiel wird dies als erster befehl aufgerufen, kann man das auch irgendwie einbinden, kann ja nicht so schwer sein.

Schranz0r

Hab dir doch schon gesagt, dass das Init nur alle Funktionen läd, mehr nicht!
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

checked doch einfach mal ob die funktion nicht vielleicht mit extern C funzen.
wenn eine dll abscmiert liegt es am falschen aufruf meistens nicht daran das sie schlech tprogrammiert wurde.

EDIT:// DEvice nicht erstellen kann vielleicht daran liegen das ihr bezug auf ein vorhandenes fenster nehmt. versucht mal ein neues.
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

Mei o mei o mei. Dann schick mir halt eine mail und ich mach Dir die 2 Funktionen rein.

Heiko

hab dir eine pn geschickt, aber hier auch nochmal für alle, die sich probieren wollen...

http://www.glbase.de/blanko.rar

geht halt bis zum öffnen eines fensters, aber direct3d device kann nicht starten irgendwie.