Seite 1 von 1

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

Verfasst: 30.05.2014 15:32
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

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

Verfasst: 30.05.2014 16:28
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:

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

Verfasst: 30.05.2014 16:59
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 ?!

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

Verfasst: 30.05.2014 19:06
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).

Struktur / Funktionsaufruf für 64 bit DLL Datei konvertiere

Verfasst: 31.05.2014 09:23
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 ?

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

Verfasst: 31.05.2014 09:54
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

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

Verfasst: 31.05.2014 10:40
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


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

Verfasst: 31.05.2014 12:26
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