_WinAPI_MakeLong / _WinAPI_MakeDWord - 2 Integerwerte in einer Variablen

    • 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).

    [autoit]

    $varLo = 65535
    $varHi = 240
    $testLong = _WinAPI_MakeLong($varLo, $varHi)

    [/autoit][autoit][/autoit][autoit]

    $loOut = _WinAPI_LoWord($testLong)
    $hiOut = _WinAPI_HiWord($testLong)
    If $hiOut < 0 Then $hiOut = 65536 + $hiOut

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit]
  • Schöner Beitrag. Gerne gelesen. Aber nur cirka 5% verstanden. Da bräuchte ich gerade mal bis Sonntag, um die Fachbegriffe zu verstehen und auch miteinander zu verstehen. Nicht böse sein, aber den Bericht werde ich wohl noch mehrmals lesen müssen.

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    @Lina
    Naja, deshalb hab ich es auch im Forum Entwickler gepostet ;)
    Aber in einem Satz zusammengefaßt:
    Du kannst Integerzahlen bis 65535 paarweise in einer Variablen ablegen.

    Mal ein Anwendungsbeispiel:
    Mit _WinAPI_GetWindowLong kannst du die Eigenschaften eines Fensters ermitteln.
    Möchtest du das Fenster mit 2 verschiedenen Eigenschaften nutzen, legst du eine Variable für Style1 und eine für Style2 an.
    Im LoWord von Var1 speicherst du den Wert für Style1 und im HiWord für ExStyle1.
    Analog in Var2 für die anderen Styles.
    In der Anwendung kannst du dann zwischen beiden Eigenschaften mit _WinAPI_SetWindowLong switchen.

  • Okay Okay, das habe ich dann etwas besser verstanden.

    DANKE.

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • hi


    nur mal so aus reiner Neugier ^^ hat es irgendwelche Speichermäßigen vorteile wenn man zwei variablen zusammenfügt? passt autoit das dynamisch an?


    grez

  • Hi maycontainnuts,

    ist eigentlich nur für die WinAPI Porgrammierung wichtig, weil dort bei der Nachrichtenverarbeitung nur zwei Parameter (wParam und lParam) zur Verfügung stehen. Und mit diesem zusammen fügen kann man zwei Werte (zum Beispiel Höhe und Breite eines Fensters) in einem Parameter unterbringen.