Seite 1 von 1

GetSystemDefaultLangID_()-Rückgabe falsch

Verfasst: 18.08.2013 15:40
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

Re: GetSystemDefaultLangID_()-Rückgabe falsch

Verfasst: 18.08.2013 16:56
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 <)

Re: GetSystemDefaultLangID_()-Rückgabe falsch

Verfasst: 18.08.2013 17:22
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.