Problem mit einer Delphi-DLL und DllCall /DllStruct (Logitech G15 lglcd_dda_dll)

  • Ich habe für die Logitech-G15-Tastatur im g15-applets Forum eine Bibliothek für den direkten Zugriff auf das Display und Funktionen wie Hintergrundbeleuchtung der Tasten, des Displays, Kontrast des Displays, die Lichter der M-Tasten gefunden.
    (Danke an Delphifreak für die klasse Arbeit)

    http://www.g15-applets.de/direkter-zugri…yusw-t2948.html

    Beim Einbinden in AutoIt scheitere ich aber gerade am Pointer auf die Display-Structur.
    Auf dem Display kommen nur wirre Muster an. Die anderen Funktionen Licht, Kontrast ... funktionieren prima.


    Hier mein bisheriger Versuch ( ... nur der relevante Teil)
    Func LgSetDisplayData($Device)
    ab: ;lglcd_dda(BOOL) LgSetDisplayData(LCDDEVICE Device, DISPLAYDATA* DisplayData);

    Bitte um Tipps was am Pointer/Struct falsch ist.

    Spoiler anzeigen
    [autoit]

    $lgDll = DllOpen("lglcd_dda_dll.dll")
    $Device = LgOpenLcdDevice(0)
    LgSetDisplayData($Device)

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

    ;lglcd_dda(LCDDEVICE) LgOpenLcdDevice(DWORD Index, BOOL Exclusive, DWORD* KeybdVer);
    Func LgOpenLcdDevice($KeybdVer)
    $result = DllCall($lgDll, "hwnd:cdecl", "LgOpenLcdDevice", "Int", 0, "dword", 0, "int*", $KeybdVer)
    If @error then
    msgbox(0,"","Error LgOpenLcdDevice")
    Exit
    EndIf
    Return $result[0]
    EndFunc

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

    ;------------------------------------------------------ aus lglcd_dda_dllimp.h
    ;
    ;lglcd_dda(BOOL) LgSetDisplayData(LCDDEVICE Device, DISPLAYDATA* DisplayData);
    ;
    ;const DWORD LGLCD_BMP_WIDTH = 160;
    ;const DWORD LGLCD_BMP_HEIGHT = 43;
    ;
    ;typedef struct {
    ; BYTE data[(LGLCD_BMP_HEIGHT / 8) + 1][LGLCD_BMP_WIDTH];
    ;} DISPLAYDATA;
    ;
    ;------------------------------------------------------------------------------
    Func LgSetDisplayData($Device)
    $str = "byte zeile1[160];byte zeile2[160];byte zeile3[160];byte zeile4[160];byte zeile5[160];byte zeile6[160]"
    $a = DllStructCreate($str)
    if @error Then
    MsgBox(0,"","Error DllStructCreate " & @error);
    exit
    endif
    ;------------- zum Test leeren, sonst $byteArray übertragen
    for $zeile = 1 To 6
    for $i = 1 To 160
    DllStructSetData($a,$zeile,0,$i)
    next
    next
    ;-------------
    $ptr = DllStructGetPtr($a)
    if @error Then
    MsgBox(0,"","Error GetPtr " & @error);
    exit
    endif
    $result = DllCall($lgDll, 'dword:cdecl','LgSetDisplayData', 'ptr', $Device, 'ptr*', $ptr)
    If @error then
    msgbox(0,"","Error LgSetDisplayData"& @error)
    Exit
    EndIf
    Return
    EndFunc

    [/autoit]
  • Neuer Versuch. Ich habe es auf "pointer to pointer" umgebaut. Leider auch ohne Erfolg

    Spoiler anzeigen
    [autoit]

    Func LgSetDisplayData($Device, $byteArray)
    $str1 = "ptr pointer"
    $a1 = DllStructCreate($str1)
    if @error Then
    MsgBox(0,"","Error in DllStructCreate Pointer" & @error);
    exit
    endif
    $str = "byte zeile1[160];byte zeile2[160];byte zeile3[160];byte zeile4[160];byte zeile5[160];byte zeile6[160]"
    $a = DllStructCreate($str)
    if @error Then
    MsgBox(0,"","Error in DllStructCreate " & @error);
    exit
    endif
    for $zeile = 1 To 6
    for $i = 1 To 160
    DllStructSetData($a,$zeile,0,$i)
    next
    next
    $ptr = DllStructGetPtr($a)
    if @error Then
    MsgBox(0,"","Error in DllPointer " & @error);
    exit
    endif
    DllStructSetData($a1,1,$ptr)
    $ptr1 = DllStructGetPtr($a1)
    if @error Then
    MsgBox(0,"","Error in DllPointer to Pointer " & @error);
    exit
    endif
    $result = DllCall($lgDll, 'int:cdecl','LgSetDisplayData', 'ptr', $Device, 'ptr*', $ptr1)
    If @error then
    msgbox(0,"","Error LgSetDisplayData"& @error)
    Exit
    EndIf
    _ArrayDisplay($result)
    Return
    EndFunc

    [/autoit]


    azunai: probier mal ... siehe dein thread

  • Theoretisch sollte "ptr*" $ptr falsch sein. Meiner Meinung nach sollte es so aussehen. Und du solltest von MsgBox und Exit bei Error umsteigen auf

    [autoit]

    Return Seterror(FEHLERNUMMER,0,0)

    [/autoit]
    Spoiler anzeigen
    [autoit]

    Global const $LGLCD_BMP_WIDTH = 160;
    Global const $LGLCD_BMP_HEIGHT = 43;

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

    Global Const $tagDISPLAYDATA = _tagDISPLAYDATA()
    Func _tagDISPLAYDATA()
    Local $struct = ""
    For $i = 1 To Floor($LGLCD_BMP_HEIGHT/8)+1
    $struct &= "byte zeile"&$i&"["&$LGLCD_BMP_WIDTH&"];"
    Next
    Return $struct
    EndFunc

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

    Func LgOpenLcdDevice($Index=0,$Exclusive=0,$KeybdVer=0)
    $result = DllCall($lgDll, "ptr:cdecl", "LgOpenLcdDevice", "Int", $Index, "dword", $Exclusive, "dword*", $KeybdVer)
    If @error then
    msgbox(0,"","Error LgOpenLcdDevice")
    Exit
    EndIf
    Return $result[0]
    EndFunc

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

    Func LgSetDisplayData($Device)
    Local $struct = DllStructCreate($tagDISPLAYDATA)
    if @error Then
    MsgBox(0,"","Error DllStructCreate " & @error);
    exit
    endif
    ;------------- zum Test leeren, sonst $byteArray übertragen
    for $zeile = 1 To 6
    for $i = 1 To 160
    DllStructSetData($a,$zeile,0,$i)
    next
    next
    ;-------------
    Local $ptr = DllStructGetPtr($a)
    if @error Then
    MsgBox(0,"","Error GetPtr " & @error);
    exit
    endif
    Local $result = DllCall($lgDll, 'dword:cdecl','LgSetDisplayData', 'ptr', $Device, 'ptr', $ptr)
    If @error then
    msgbox(0,"","Error LgSetDisplayData"& @error)
    Exit
    EndIf
    Return
    EndFunc

    [/autoit]


    Hab mal die header-Datei angehängt :)

    lglcd_dda_dllimp.h
  • Perfekt gelöst .. Danke progandy :rock:

    Der Pointer auf ... Global Const $tagDISPLAYDATA = _tagDISPLAYDATA() war's.

  • kannst deine funktionen zu der dll ja mal hier einstellen, sodass andere leute diese auch nutzen können :)