 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 17.10.2008, 19:01 Titel: DLL Funktionen nutzen? |
|
|
Kann mir jemand ein Beispiel nennen, wie man eine DLL lädt, und deren Funktionen nutzen kann.
Eine DLL hab ich, kenne auch deren Funktionen inkl. Übergabeparameter etc.
Ein Stück code, wo eine dll geladen wird, declare usw usw und eben die Funktion dann.
Ich müsste erst probieren, möchte aber einfach wissen ob sich Freebasic für ein Projekt von mir eignet.
Diese Funktionalität müsste schon gegeben sein.
Achja, ist INLINE C++ auch möglich?(das aber nur am Rande) |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.10.2008, 19:25 Titel: |
|
|
inline-c++ ist nicht möglich.
Deklaration einer Funktion aus einer DLL geht wie folgt:
Code: |
DELCARE FUNCTION funktionsname LIB "libname" [ALIAS "name_der_funktion_in_der_lib"] ([Parameter...])
|
_________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 17.10.2008, 19:29 Titel: |
|
|
aha, okay.wie schauts mit rückgabewerten aus, etc. ?
und muss man dann die funktion nochmal extra angeben?
also
Function bla: (param1, param2)
bla ......
Return xyz
End Function
usw.
wie wird da in FB gehandhabt?
Und sind immer die Datentypen mit anzugeben?
Wie werden Strings an eine solche Funktion in einer DLL übergeben?
Irgendetwas spezielles zu beachten?
Ich muss, Integer, Float, Strings übergeben können, und auch zurückgeben lassen können.
achja, in der dll sind mehrere hundert funktionen, wie kann ich die dll dann einer variablen zuweisen, würde es einfacher machen. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.10.2008, 20:54 Titel: |
|
|
du weißt schon, was eine funktion ist?
eine funktion gibt genau einen parameter zurück, also z.B.
Code: |
ergebnis = berechne(1,2)
|
sollen die übergebenen paremter verändert werden, so müssen diese "ByVal" übergeben weden:
Code: | DELCARE FUNCTION funktionsname LIB "libname" [ALIAS "name_der_funktion_in_der_lib"] (BYVAL parameter1) |
http://www.freebasic-portal.de/index.php?s=reftopic&id=157 _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 17.10.2008, 21:20 Titel: |
|
|
mmm
ich hab das jetzt so versucht, hab eine include gemacht, und zum beispiel dieses declare versucht...
Code: | DECLARE FUNCTION xGraphics3D LIB "Xors3d.dll" ALIAS "_xGraphics3D@20" (Widtha As Integer,height As Integer, depth As Integer = 32, mode As Integer = 0, vsync As Integer = 1 ) As integer |
wenn ich in der .bas diesen befehl verwende, kommt der fehler es sei nicht deklariert?!?
in glbasic wird das bisher so gehandhabt....
Code: | DECLARE_ALIAS(wrap_xLoadMesh, DLL, "_xLoadMesh@8", (char*,int), int); |
und dazu diese funktion...
Code: | FUNCTION xLoadMesh: path$,parent=0
fkt_rv=(DGInt)wrap_xLoadMesh((char*)path_Str.GetStrData(),(int)parent);
return fkt_rv;
ENDFUNCTION |
so in der art, das mal als abgeändertes beispiel, weil dort noch inline dazukommt, was aber bei FB nicht notwendig zu sein scheint.
Ich will nur funktionen einer dll wrappen, eventuell parameter als float, integer, oder string übergeben, und bei manchen funktionen keinen rückgabewert, oder auch mal integer, float oder string.
kann ja nicht so schwer sein, oder?
[edit] wo bitteschön muss sich die dll sich befinden, hab die im projektordner, kann sie aber irgendwie nicht finden ... |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.10.2008, 21:41 Titel: |
|
|
das @20 darf da AFAIK gar nicht hin. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 17.10.2008, 21:44 Titel: |
|
|
ähm warum nicht, das gehört da aber hin.
so wird die funktion IN der dll aber gefunden....
hier mal mein momentaner quelltext...
Code: | #INCLUDE "xors3dtest.bi"
xGraphics3D(800,600)
xUpdateWorld(1.0 )
xRenderWorld()
xFlip()
|
und die include
Code: | DECLARE FUNCTION xGraphics3D LIB "Xors3d.dll" ALIAS "_xGraphics3D@20" (Widtha As Integer,height As Integer, depth As Integer = 32, mode As Integer = 0, vsync As Integer = 1 ) As integer
DECLARE FUNCTION xUpdateWorld LIB "Xors3d.dll" ALIAS "_xUpdateWorld@4" (speed As Double = 1.0) as integer
DECLARE FUNCTION xRenderWorld LIB "Xors3d.dll" ALIAS "_xRenderWorld@4" (twen As Integer = 1) as integer
DECLARE FUNCTION xFlip LIB "Xors3d.dll" ALIAS "_xFlip@0" () As Integer
|
die ausgabe lautet....
Code: | C:\Program Files\FreeBASIC\fbc -s gui "xors3dtest.bas"
C:\PROGRA~1\FREEBA~1\bin\win32\ld.exe: cannot find -lXors3d.dll
Make done
|
okay ich bräuchte keine gui, oder so, eigentlich gar kein fenster irgendeiner art, da die dll das alles macht.
3d engine halt. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 18.10.2008, 00:43 Titel: |
|
|
ach, ich habs, so geht es.....
Code: | DIM library AS ANY PTR
library = DYLIBLOAD( "Xors3D" )
Dim xGraphics3D As Function (Widtha AS INTEGER,height AS INTEGER, depth AS INTEGER = 32, mode AS INTEGER = 0, vsync AS INTEGER = 1 ) AS INTEGER
Dim xRenderWorld As Function (twen AS INTEGER = 1 ) AS INTEGER
Dim xUpdateWorld As Function (speed AS DOUBLE = 1.0) AS INTEGER
Dim xFlip As Function () AS INTEGER
xGraphics3D = DYLIBSYMBOL( library, "_xGraphics3D@20" )
xRenderWorld = DYLIBSYMBOL( library, "_xRenderWorld@4" )
xUpdateWorld = DYLIBSYMBOL( library, "_xUpdateWorld@4" )
xFlip = DYLIBSYMBOL( library, "_xFlip@0" ) |
aber mal eine frage.
kann mann das nicht auch einfach machen, so pro funktion nur eine zeile, oder so? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 18.10.2008, 01:06 Titel: |
|
|
ach ja, wenn du die DLLs per DECLARE einbinden willst, brauchst du header-dateien, und die gibt's für deine DLL natürlich nicht... ich weiß jetzt nicht auswendig, wie man die teile erstellt, wird sich irgendwo im englischen Forum finden.  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 18.10.2008, 02:13 Titel: |
|
|
mmm also so wie in meinem letzten post funktioniert es ja, aber kann man das nicht auch etwas einfacher haben?
also den code vereinfachen, um die dll funktionen zu nutzen?
wäre extrem nett, wenn jemand wüßte wie, weil ich würd gern mehrere hundert befehle für FB Wrappen, is eine kleine nette engine(okay nich kostenlos), mit der man dx9 nutzen kann inklusive aller möglichen effekte, sogar physic könnte ich noch dafür wrappen, aber das ist ne heidenarbeit, wenn also jemand noch nen rat wüßte.....
so wär das cool.smile
Code: | Dim xFlip = DYLIBSYMBOL( library, "_xFlip@0" ) As Function () AS INTEGER |
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|