xinput.dll Code läuft nur in x86 Umgebung einwandfrei ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

xinput.dll Code läuft nur in x86 Umgebung einwandfrei ?

Beitrag von 3dhubiflieger »

Hallo, ich hatte mal vor geraumer Zeit den Code (Link) gepostet.
http://forums.purebasic.com/german/view ... uidebutton

Jetzt wollte ich den Code für mein XBox360 Gamepad in 64 bit kompilieren, und seitdem verhält sich dieser total merkwürdig bzw funktioniert gar nicht !!! Das komische ist, das er mir in 32 bit (x86) die richtigen Daten ausspuckt ! Aber sobald ich Versuche das ganze unter 64 bit laufen zu lassen, gehen nur die x Achse und ein Teil der Y Achse ?? Den Guidebutton kann ich dann überhaupt nicht mehr abfragen ?? Warum ist das so ? Bei der Dll habe ich kein Verzeichniss angegeben, also wird ja die richtige 64 bit dll geladen ? (bei 64 bit OS) Any Help ? :)

Code: Alles auswählen

#XINPUT_GAMEPAD_GUIDE = $0400 ;Der Guidebutton !!
#DLLDatei             = "xinput1_3.dll"

Structure XINPUT_GAMEPAD
  wButtons.w
  bLeftTrigger.b
  bRightTrigger.b
  sThumbLX.w
  sThumbLY.w
  sThumbRX.w
  sThumbRY.w
EndStructure

Prototype guidbutton(ui, *pState.XINPUT_GAMEPAD)

Procedure Button()
  ;ermittelt welcher Knopf gedrueckt wurde (unter anderem für Guidebutton wichtig !)
  
  Protected xinput.l, getguidbutton.guidbutton, x_struct.XINPUT_GAMEPAD
 
  xinput.l = OpenLibrary (#PB_Any, #DLLDatei)
  
  guid.guidbutton = GetFunctionEntry(xinput, 100)
  
  
  If xinput
   
    guid(0, @XINPUT_GAMEPAD)
    
    Variable.Xinput_Gamepad
    
    CloseLibrary (xinput)
    
    ProcedureReturn Variable\wbuttons
    

    
  EndIf
  
  

EndProcedure



Repeat
  Debug BUTTON()
ForEver
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: xinput.dll Code läuft nur in x86 Umgebung einwandfrei ?

Beitrag von _JON_ »

Also hier musst Du schon mal das .l entfernen,
Pointer sind bei 64-Bit 8 Byte lang und können nicht in ein Long gepresst werden.

Code: Alles auswählen

Protected xinput.l, getguidbutton.guidbutton, x_struct.XINPUT_GAMEPAD
 xinput.l = OpenLibrary (#PB_Any, #DLLDatei)
Auch musst die DLL natürlich eine x64 version sein.

PS: ein bisschen mehr Error-Handling wäre auch besser :wink:
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: xinput.dll Code läuft nur in x86 Umgebung einwandfrei ?

Beitrag von 3dhubiflieger »

Code: Alles auswählen


#XINPUT_GAMEPAD_GUIDE = $0400 ;Der Guidebutton !!
#DLLDatei             = "xinput1_3.dll"

Structure XINPUT_GAMEPAD
  wButtons.w
  bLeftTrigger.b
  bRightTrigger.b
  sThumbLX.w
  sThumbLY.w
  sThumbRX.w
  sThumbRY.w
EndStructure

Prototype guidbutton(ui, *pState.XINPUT_GAMEPAD)

Procedure Button()
  ;ermittelt welcher Knopf gedrueckt wurde (unter anderem für Guidebutton wichtig !)
 
  Protected xinput, getguidbutton.guidbutton, x_struct.XINPUT_GAMEPAD
 
  xinput = OpenLibrary (#PB_Any, #DLLDatei)
 
  guid.guidbutton = GetFunctionEntry(xinput, 100)
 
 
  If xinput
   
    guid(0, @XINPUT_GAMEPAD)
   
    Variable.Xinput_Gamepad
   
    CloseLibrary (xinput)
   
    ProcedureReturn Variable\wbuttons
   

   
  EndIf
 
 

EndProcedure



Repeat
  Debug BUTTON()
ForEver


So Long entfernt, mal vom Errorhandling abgesehn....trotzdem immer noch das selbe, mir ist der Code ein Rätsel ?!
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: xinput.dll Code läuft nur in x86 Umgebung einwandfrei ?

Beitrag von HeX0R »

Das ist irgendwie ein ziemliches Durcheinander bei dir...

Wundert mich im Moment ehrlich gesagt, dass das in x86 funktionieren soll.

Ich würde mal empfehlen EnableExplicit oben in Deinen Code zu platzieren, dann sollte Dir zumindest ein Licht aufgehen.
Obgleich ich mangels dieser DLL auch nicht sagen kann, ob das der einzige Fehler ist (den ich hier sehe).
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Struktur / Funktionsaufruf für 64 bit DLL Datei konvertiere

Beitrag von 3dhubiflieger »

Also ich habe das mit enable explicit probiert, allerdings versteh ich nich wie ich das bei den Strukturen anwenden soll, da mir das Programmieren mit Strukturen noch sehr schwer fällt.
Hier denke ich, ist auch irgendwo der Fehler zu finden (vom Enableexplicit abgesehen). Wenn ich oben bei

Code: Alles auswählen

Structure XINPUT_GAMEPAD
  wButtons.w
den Word Wert in Integer ändere, wird zumindest schon mal mein guidebutton registriert und unterschieden. Allerdings befindet sich ein counter in dem Integerwert und ich kann ihn mit $0400
nicht abfragen !

Jetzt meine Frage, kann es sein das man vordefinierten Funktionen in 64 bit dll dateien andere Variablendeklarationen als wie 32 bit dll Dateien zuweisen muss ? In dem Link http://www.autohotkey.com/board/topic/9 ... de-button/ wird wohl von der 32 Bit DLL ausgegangen ?! Muss ich die Variablendeklarationen der Struktur oder Funktionen irgendwie konvertieren ?
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: xinput.dll Code läuft nur in x86 Umgebung einwandfrei ?

Beitrag von HeX0R »

Die Strukturen für 64 Bit DLLs brauchen manchmal noch ein Align 8, um zu funktionieren.
Aber nichts desto trotz kann Dein geposteter Code so nie funktionieren.

Ich hatte gehofft, Du findest es selbst, macht aber nichts, dann kläre ich Dich mal auf:

1.)

Code: Alles auswählen

Protected xinput, getguidbutton.guidbutton, x_struct.XINPUT_GAMEPAD
Ist ja schön, dass Du getguidbutton und x_struct definiert hast, Du benutzt es aber nirgends.
2.)

Code: Alles auswählen

guid(0, @XINPUT_GAMEPAD)
Das funktioniert so nicht!
Du kannst keine Adresse einer Struktur übergeben, Strukturen sind nur Hilfsmittel für den Compiler.
Wenn müsstest Du es so machen:

Code: Alles auswählen

guid(0, @x_struct)
Also eine Variable übergeben, die Du der Struktur zugewiesen hast.
In Deinem Fall wird aus dem XINPUT_GAMEPAD einfach eine Variable vom Wert Integer (da sollte der Compiler gemeckert haben, wenn EnableExplicit an ist)
3.)

Code: Alles auswählen

ProcedureReturn Variable\wbuttons
Du hast die Variable zwar definiert, ihr aber nicht den Rückgabewert von guid() zugewiesen.
Da kann also eigentlich nie was anderes als 0 rauskommen, es sei denn Du hast nicht den Code gepostet, den Du wirklich verwendest.
Richtig wäre:

Code: Alles auswählen

ProcedureReturn x_struct\wbuttons
Wenn das immernoch nicht hinhaut, versuche mal (für 64Bit), den Kopf der Struktur wie folgt zu ändern:

Code: Alles auswählen

Structure XINPUT_GAMEPAD Align 8
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: xinput.dll Code läuft nur in x86 Umgebung einwandfrei ?

Beitrag von 3dhubiflieger »

So hab mal alles so gemacht wie Du meinst inkl enableexplicit ! Hab alles so einfach wie möglic gemacht ! Das Kernproblem besteht aber weiterhin ! Align geht bei mir net ich hab noch Purebasic 4.6 ?

Code: Alles auswählen

EnableExplicit

Structure XINPUT_GAMEPAD 
  wButtons.w  ;<-- Hier liegt irgendwie des Pudels Kern..scheint so als wenn falsch in den    ;Speicher geschrieben wird !

  bLeftTrigger.b
  bRightTrigger.b
  sThumbLX.w
  sThumbLY.w
  sThumbRX.w
  sThumbRY.w
EndStructure

Prototype  guidefunction(UserIndex.i, *pState.XINPUT_GAMEPAD)

Procedure Guidebutton()
  ;ermittelt ob der Guidbutton (der Knopf in der Mitte) gedrückt wurde !
 
  Protected xinput, x_struct.XINPUT_GAMEPAD  ,guidecall.guidefunction
 
  xinput = OpenLibrary (#PB_Any, "xinput1_3.dll")
 
  If xinput
   
    guidecall = GetFunctionEntry(xinput, 100)
    
    
    guidecall(0, @x_struct)
    
    Debug x_struct\wbuttons 
    
    
    CloseLibrary (xinput)
   
  
  EndIf
 
EndProcedure


Repeat
  
  
  guidebutton()
  
ForEver

3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: xinput.dll Code läuft nur in x86 Umgebung einwandfrei ?

Beitrag von 3dhubiflieger »

So...falls hier mal jemand das gleiche Problem mit 64 bit hat..
Hab jetzt laut Doku in Erfahrung bringen können das der erste Wert in der Struktur
die Packetnumber ist ! Hab erst gedacht es handelt sich um WButtons ! Problem gelöst ! :bounce:

Code: Alles auswählen

EnableExplicit



;XBox 360 Gamepad Struktur inkl Guidebutton ! 
Structure XINPUT_GAMEPAD
  PacketNumber.l  ;Gibt Zurück ob irgendeine Joypadtaste gedrückt wurde <-WAR DER FEHLER !
  wButtons.W      ;gibt an welche (unter anderem Guidebutton)
  bLeftTrigger.B  ;Schultertasten hinten linke Seite auswerten
  bRightTrigger.B ;Schultertasten hinten rechte Seite auswerten
  sThumbLX.W      ;XAchse des linken Knüppels
  sThumbLY.W      ;YAchse des linken Knüppels 
  sThumbRX.W      ;XAchse des rechten Knüppels
  sThumbRY.W      ;YAchse des rechten Knüppels
EndStructure




Prototype.i guidefunction(UserIndex.w, *pState.XINPUT_GAMEPAD)

Procedure Guidebutton()
  ;ermittelt ob der Guidbutton (der Knopf in der Mitte) gedrückt wurde !
 
  Protected xinput, x_struct.XINPUT_GAMEPAD  ,guidecall.guidefunction
 
  xinput = OpenLibrary (#PB_Any, "xinput1_3.dll")
 
  If xinput
   
    guidecall = GetFunctionEntry(xinput, 100)
    
    guidecall(0, @x_struct)
    
    CloseLibrary (xinput)
    
    If x_struct\wbuttons = $0400
   
     ProcedureReturn #True
     
   EndIf
  
  EndIf
 
EndProcedure


Repeat
  
  
  Debug guidebutton()
  
ForEver
Antworten