Seite 1 von 2
DLL Erstellung+Nutzung
Verfasst: 26.04.2006 20:24
von Mr.Hahn
Hallihallo,
ich hab grad erstmal wieder einen meiner älteren grösseren Programmcodes angeschaut. Ich habe NICHTS wiedergefunden, absolut nichts!
Um meinen Code in Zukunft besser strukturieren zu können, wollte ich mir eine Library schreiben mit den Befehlen, die ich am häufigsten benutze (für 2D-Scrolling, Kollision usw. ) Also ab in die Anleitung und dann einen Code geschrieben!
So sieht er dann aus:
Code: Alles auswählen
ProcedureDLL ScrollByMouse(PosX,PosY)
If MouseX() <= 0
PosX + 5
EndIf
If MouseX() >= 980
PosX - 5
EndIf
If MouseY() <= 0
PosY + 5
EndIf
If MouseY() >= 700
PosY - 5
EndIf
If HiPoX <= -1024
PosX + 5
EndIf
If HiPoX >= 0
PosX - 5
EndIf
If HiPoY <= - 768
PosY + 5
EndIf
If HiPoY >= 0
PosY - 5
EndIf
EndProcedure
Also DLL erstellt, und gleich mal ein Prog geschrieben das diese nutzen soll, so sieht der Teil aus, der die DLL sowie eine funktion aufruft:
Code: Alles auswählen
OpenLibrary(0,"Library.dll")
CallFunction(0,"_ScrollByMouse",PanzerPosX,PanzerPosY)
CloseLibrary(0)
Leider tut sich *gar nichts*. Wenn ich den Code aus der ProcedureDLL direkt einfüge, geht es...
Was mache ich falsch ?

[/code]
Verfasst: 26.04.2006 20:51
von Mr.Hahn
Achja, ich hab Global für die Vars benutzt (PanzerPosX und Y )
Verfasst: 26.04.2006 22:27
von real
Naja - die DLL funktioniert wohl schon.
Du übergibst Werte an die DLL, die dort geändert werden. Allerdings bekommt Dein Programm davon nichts mit, weil Du die Änderungen nicht an das Programm zurückgibst (guckst Du ProcedureReturn).
Verfasst: 27.04.2006 14:52
von Mr.Hahn
aha....kann ich den hinter ProcedureReturn mehrere Variablen schreiben?
Verfasst: 27.04.2006 15:05
von Leonhard
So sollte es eigendlich funktionieren:
Code: Alles auswählen
; ---------- DLL
Structure Koordinaten
x.l
y.l
EndStructure
ProcedureDLL.l ScrollByMouse(HiPoX,PosX,PosY)
Protected *Out.Koordinaten
If MouseX() <= 0
*Out\x = PosX + 5
EndIf
If MouseX() >= 980
*Out\x = PosX - 5
EndIf
If MouseY() <= 0
*Out\y = PosY + 5
EndIf
If MouseY() >= 700
*Out\y = PosY - 5
EndIf
If HiPoX <= -1024
*Out\x = PosX + 5
EndIf
If HiPoX >= 0
*Out\x = PosX - 5
EndIf
If HiPoY <= - 768
*Out\y = PosY + 5
EndIf
If HiPoY >= 0
*Out\y = PosY - 5
EndIf
ProcedureReturn *Out
EndProcedure
; ---- Hauptprogramm:
Structure Koordinaten
x.l
y.l
EndStructure
OpenLibrary(0,"Library.dll")
Panzer.Koordinaten
Panzer=CallFunction(0,"ScrollByMouse",HiPoX,PanzerPosX,PanzerPosY)
Panzer\X ; Der Rückgabewert X
Panzer\Y ; Der Rückgabewert Y
CloseLibrary(0)
Verfasst: 27.04.2006 15:06
von kurt'94
ehrlich gesagt hab ich keine ahnung wie das in purebasic ist, aber in c++ kann man immer nur einen wert zurückgeben...
du könntest ja mal versuchen zeiger (pointer) zu übergeben... dann müsste es eigentlich gehen...
MFG kurt
Verfasst: 27.04.2006 15:17
von Leonhard
Dann mach das So:
Code: Alles auswählen
; ---------- DLL
ProcedureDLL.l ScrollByMouse(HiPoX,PosX,PosY)
Protected *MemID
If MouseX() <= 0
PosX + 5
EndIf
If MouseX() >= 980
PosX - 5
EndIf
If MouseY() <= 0
PosY + 5
EndIf
If MouseY() >= 700
PosY - 5
EndIf
If HiPoX <= -1024
PosX + 5
EndIf
If HiPoX >= 0
PosX - 5
EndIf
If HiPoY <= - 768
PosY + 5
EndIf
If HiPoY >= 0
PosY - 5
EndIf
*MemID = AllocateMemory(SizeOf(Long)*2+2)
PokeS(*MemID,Str(PosX)+"|"+Str(PosY))
ProcedureReturn *MemID
EndProcedure
; ---- Hauptprogramm:
OpenLibrary(0,"Library.dll")
String$=PeekS(CallFunction(0,"ScrollByMouse",HiPoX,PanzerPosX,PanzerPosY))
PanzerPosX=Val(StringField(String$,1,"|")) ; Der Rückgabewert X
PanzerPosY=Val(StringField(String$,2,"|")) ; Der Rückgabewert Y
CloseLibrary(0)
Verfasst: 27.04.2006 15:33
von Mr.Hahn
Ich check da gar nichts, sorry

ich glaub ich mach lieber eine Funktion ScrollByMouseX und eine Y ...!

Verfasst: 27.04.2006 15:37
von Kaeru Gaman
wobei du dir durchaus die frage stellen solltest, ob es sinnvoll ist, sowas als DLL einzubinden.
ich weiß nicht, ob eine DLL-proc noch langsamer ist als eine normale,
aber für solche mini-teile sind macros noch effektiver....
Verfasst: 27.04.2006 15:40
von Mr.Hahn
also ich will da einfach alles was mein 2D-Rendering betrifft reinpacken...
BTW: was bitte sind macros?

die kenn ioch höchstens bei World of WarCraft

oder bei einer Digitalkamera
