- Offizieller Beitrag
Hi,
ich hab mal ein wenig in den WinAPI-Funktionen gestöbert. Da gibt es sicher noch Vieles, was so nach und nach in unsere tägliche Programmierung einfließen wird.
Dabei bin ich über _WinAPI_MakeLong und _WinAPI_MakeDWord gestolpert.
Beide Funktionen bieten die Möglichkeit, einer Variablen 2 Integer-Werte zuzuordnen - einmal im LoWord-Sektor und einmal im HiWord-Sektor.
Der speicherbare Zahlenbereich erstreckt sich von 0-65535 (Word = 16 Bit).
Die Werte lassen sich aus der Variablen mit _WinAPI_LoWord bzw. _WinAPI_HiWord selektieren.
Eine Besonderheit ergibt sich hierbei:
Während _WinAPI_LoWord den Wert genau, wie übergeben zurückgibt, werden alle Zahlen > 32767 von _WinAPI_HiWord als negative Zahl, rückwärts auf Null zählend zurückgegeben, wobei die erste Negativzahl -32768 ist.
Daraus folgt: Wenn _WinAPI_HiWord negativ, dann gilt: Integerwert = 65536 + neg. Rückgabewert
Ob man _WinAPI_MakeLong oder _WinAPI_MakeDWord verwendet ist für diese Art der Anwendung ohne Belang. Ich würde aber _WinAPI_MakeLong bevorzugen, da hier die Reihenfolge der Parameter logischer ist (erst LoWord, dann HiWord).
$varLo = 65535
$varHi = 240
$testLong = _WinAPI_MakeLong($varLo, $varHi)
$loOut = _WinAPI_LoWord($testLong)
$hiOut = _WinAPI_HiWord($testLong)
If $hiOut < 0 Then $hiOut = 65536 + $hiOut
MsgBox(0, 'ausgelesene Werte', 'LoWord: ' & $loOut & @LF & 'HiWord: ' & $hiOut)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Func _WinAPI_MakeLong($iLo, $iHi)
Return BitOR(BitShift($iHi, -16), BitAND($iLo, 0xFFFF))
EndFunc
Func _WinAPI_MakeDWord($HiWord, $LoWord)
Return BitOR($LoWord * 0x10000, BitAND($HiWord, 0xFFFF))
EndFunc
Func _WinAPI_HiWord($iLong)
Return BitShift($iLong, 16)
EndFunc
Func _WinAPI_LoWord($iLong)
Return BitAND($iLong, 0xFFFF)
EndFunc