GetSystemDefaultLangID_()-Rückgabe falsch

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

GetSystemDefaultLangID_()-Rückgabe falsch

Beitrag von Regenduft »

Bevor ich wieder fleißig und falsch ins Bug-Forum poste und eins auf die Mütze bekomme... ;)

Wenn ich mit PB5.20b10(x86/x64) die folgenden Codes kompiliere (durch CompilerSelect getrennte Umformungen), dann ist immer der GetSystemDefaultLangID_()-Rückgabewert jeweils ab dem zweiten Aufruf falsch. Genauer: Byte 0 und Byte 1 sind richtig und Byte 2 enthält bei jeder Kompilierung einen anderen Wert; dann aber immer pro Aufruf mit falscher Rückgabe den selben Wert.

Daher fogenden Fragen:
  1. Woher kommt Byte 2, wenn der Rückgabewert nur ein Word ist?
  2. Wieso taucht dieses Problem bei ähnlichen Funktionen wie z.B. GetUserDefaultLangID_() nicht auf?
  3. In Bezug auf 2., warum ändert sich durch manuellen Import nichts an dem Problem?

Code: Alles auswählen

CompilerSelect 1 ; 1 bis 5 (div. Code-Umformungen)

CompilerCase 1
  Debug Str($FFFF) + " (max unsigned Word)"
  Debug GetSystemDefaultLangID_()
  Debug GetSystemDefaultLangID_()
  Debug GetSystemDefaultLangID_()
  Debug GetSystemDefaultLangID_()

CompilerCase 2
  Debug Str($FFFF) + " (max unsigned Word)"
  n = GetSystemDefaultLangID_() : Debug n
  n = GetSystemDefaultLangID_() : Debug n
  n = GetSystemDefaultLangID_() : Debug n
  n = GetSystemDefaultLangID_() : Debug n

CompilerCase 3
  Import "kernel32.lib"
    GetSystemDefaultLangID.u()
  EndImport
  Debug Str($FFFF) + " (max unsigned Word)"
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()

CompilerCase 4
  Import "kernel32.lib"
    GetSystemDefaultLangID.w()
  EndImport
  Debug Str($FFFF) + " (max unsigned Word)"
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()

CompilerCase 5
  Import "kernel32.lib"
    CompilerIf SizeOf(Integer) = SizeOf(Quad)
      GetSystemDefaultLangID.u() As "GetSystemDefaultLangID"
    CompilerElse
      GetSystemDefaultLangID.u() As "_GetSystemDefaultLangID@0"
    CompilerEndIf
  EndImport
  Debug Str($FFFF) + " (max unsigned Word)"
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()
  Debug GetSystemDefaultLangID()

CompilerEndSelect
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: GetSystemDefaultLangID_()-Rückgabe falsch

Beitrag von ts-soft »

Ich denke mal, der Debugger casted das sowieso nicht und Import scheint das auch nicht zu berücksichtigen.
Also, selber einer Wordvar zuordnen oder mit LoWord Macro arbeiten.

Code: Alles auswählen

Macro LoWord(long)
  long & $FFFF
EndMacro

Debug LoWord(GetSystemDefaultLangID_())
Debug LoWord(GetSystemDefaultLangID_())
Nur als workaround, ob das ein Bug oder missing Feature ist, mögen andere entscheiden <)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: GetSystemDefaultLangID_()-Rückgabe falsch

Beitrag von Regenduft »

Aber wieso tritt das Problem dann wirklich nur ausschließlich bei GetSystemDefaultLangID_() auf? Ich glaube kaum, dass ich einen WinAPI-Bug gefunden habe. :wink:

Was der Debugger castet ist ja zumindest in dem Beispiel in dem ich vor der Ausgabe in eine Variable zuweise komplett schnurz. Normalerweise arbeitet PureBasic doch zuverlässig sign extending (MOVS). Zumindest bei Zuweisung Word-Variable in einen größeren Typ oder Prozedur-Word-Rückgabe in einen größeren Typ funktioniert es ja auch tadellos...

Nachtrag: Bei vorzeichenlosen Variablen natürlich zero extending.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten