DLL Erstellung+Nutzung

Für allgemeine Fragen zur Programmierung mit PureBasic.
Mr.Hahn
Beiträge: 62
Registriert: 09.09.2005 18:24

DLL Erstellung+Nutzung

Beitrag 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 ? :roll: [/code]
Mr.Hahn
Beiträge: 62
Registriert: 09.09.2005 18:24

Beitrag von Mr.Hahn »

Achja, ich hab Global für die Vars benutzt (PanzerPosX und Y )
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag 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).
Mr.Hahn
Beiträge: 62
Registriert: 09.09.2005 18:24

Beitrag von Mr.Hahn »

aha....kann ich den hinter ProcedureReturn mehrere Variablen schreiben?
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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)
Zuletzt geändert von Leonhard am 27.04.2006 15:09, insgesamt 2-mal geändert.
Benutzeravatar
kurt'94
Beiträge: 33
Registriert: 21.12.2005 21:39
Wohnort: Gropü
Kontaktdaten:

Beitrag 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
der Tod ist sicher
------------------------
das Leben nicht...
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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)
Mr.Hahn
Beiträge: 62
Registriert: 09.09.2005 18:24

Beitrag von Mr.Hahn »

Ich check da gar nichts, sorry :roll: ich glaub ich mach lieber eine Funktion ScrollByMouseX und eine Y ...! <)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Mr.Hahn
Beiträge: 62
Registriert: 09.09.2005 18:24

Beitrag 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 <)
Antworten