C++ Script-Ausschnitt zu AutoIt übersetzen

  • Hi,
    ich habe in meinem Notebook eine LED-Lampe eingebaut, die leuchten soll wenn man eine neue E-Mail hat. Abgesehen davon das das Programm von ASUS was dafür vorgesehen ist eine sehr große CPU-Auslastung verursacht, würde ich gerne ein eigenes Script schreiben mit dem ich die Lampe selber steuern kann.

    Ich habe bereits ein C++-Script gefunden womit man die Lampe steuern kann, aber weil ich kein C++ kann will ich das nach AutoIt übersetzen :P.

    Das komplette C++-Script ist hier zu finden: http://www.asusforum.encke.net/UpDownload-req-getit-lid-7.html

    Ich habe bereits mit googlen folgenes hinbekommen:

    [autoit]

    ATKACPIhandle = CreateFile("\\\\.\\ATKACPI",
    GENERIC_READ|GENERIC_WRITE,
    FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
    0, NULL);

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

    Global $inbuf[5],$outbuf[192]
    $inbuf[0] = 2
    $inbuf[1] = 0x44454c4D
    $inbuf[2] = 1
    $inbuf[3] = 8
    $inbuf[4] = (DWORD)&cbuf
    $bytes=0

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

    DeviceIoControl(ATKACPIhandle, 0x222404, $inbuf, sizeof(inbuf),$outbuf, sizeof(outbuf), &bytes, NULL)

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

    Func DeviceIoControl($hDevice, $dwIoControlCode, $lpInBuffer, $nInBufferSize, $lpOutBuffer, $nOutBufferSize, $lpBytesReturned = 0, $lpOverlapped = 0)
    $Call = DllCall("Kernel32.dll","bool","DeviceIoControl","handle", $hDevice, "dword", $dwIoControlCode, "ptr", $lpInBuffer, _
    "dword", $nInBufferSize, "ptr", $lpOutBuffer, "ptr", $lpBytesReturned, "ptr", $lpOverlapped)
    Return $Call[0]
    EndFunc

    [/autoit]


    Jetzt fehlt eben nur noch das, was in dem Script oben nicht mit der AutoIt-Syntax übereinstimmt. Bei den Sachen komme ich leider nicht weiter :(.

    Ich hoffe, jemand von euch weiß was die C++-Funktionen bedeuten und kennt sich so gut mit AutoIt aus dass er weiß was das Gegenstück dazu ist :).

  • Hmm, also so funktioniert es auf jeden Fall nicht :(:

    [autoit]

    $ATKACPIhandle=FileOpen("\\\\.\\ATKACPI")

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

    Global $inbuf[5],$outbuf[192],$cbuf[3]
    $cbuf[0]=0
    $cbuf[1]=4
    $cbuf[2]=1
    $inbuf[0] = 2
    $inbuf[1] = 0x44454c4D
    $inbuf[2] = 1
    $inbuf[3] = 8
    $inbuf[4] = $cbuf
    $bytes=0

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

    DeviceIoControl($ATKACPIhandle, 0x222404, $inbuf, 5,$outbuf, 192, $bytes, 0)

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

    Func DeviceIoControl($hDevice, $dwIoControlCode, $lpInBuffer, $nInBufferSize, $lpOutBuffer, $nOutBufferSize, $lpBytesReturned = 0, $lpOverlapped = 0)
    $Call = DllCall("Kernel32.dll","bool","DeviceIoControl","handle", $hDevice, "dword", $dwIoControlCode, "ptr", $lpInBuffer, _
    "dword", $nInBufferSize, "ptr", $lpOutBuffer, "ptr", $lpBytesReturned, "ptr", $lpOverlapped)
    Return $Call[0]
    EndFunc

    [/autoit]

    "AutoIt funktioniert nicht mehr" kommt dann als Fehlermeldung.

  • Moin,

    so müsste das ungefähr aussehen ...

    Spoiler anzeigen
    [autoit]


    $ATKACPIhandle = _WinAPI_CreateFile ("\\.\ATKACPI", 2, 6, 6)
    If (not $ATKACPIhandle) Then
    MsgBox (BitOR($MB_OK, $MB_ICONHAND), "Error", "ATK0100 Driver not found!");
    Exit
    EndIf

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

    Func CtrlACPI ($code, $hasArg, $arg)

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

    Local $bytes = DllStructCreate ("DWORD;");
    Local $inbuf = DllStructCreate ("DWORD_PTR [5];");
    Local $cbuf = DllStructCreate ("WORD cmds [2]; DWORD cm2;");
    Local $outbuf = DllStructCreate ("DWORD [192];");
    Local $ret;

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

    DllStructSetData ($bytes, 1, 0);

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

    DllStructSetData ($cbuf, "cmds", 0, 1);
    DllStructSetData ($cbuf, "cmds", 0, 2);
    DllStructSetData ($cbuf, "cm2", $arg);

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

    DllStructSetData ($inbuf, 1, 2, 1);
    DllStructSetData ($inbuf, 1, $code, 2);
    DllStructSetData ($inbuf, 1, $hasArg, 3);
    DllStructSetData ($inbuf, 1, 8 * $hasArg, 4);
    DllStructSetData ($inbuf, 1, DllStructGetPtr ($cbuf), 5);

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

    $ret = DeviceIoControl( _
    $ATKACPIhandle, _
    0x222404, _
    DllStructGetPtr ($inbuf), _
    DllStructGetSize ($inbuf),
    DllStructGetPtr ($outbuf), _
    DllStructGetSize ($outbuf), _
    DllStructGetPtr ($bytes), _
    0 _
    );

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

    return $ret;

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

    EndFunc

    [/autoit]

    EDIT: Patzer korrigiert ...

    Gruß
    Greenhorn


    3 Mal editiert, zuletzt von Greenhorn (24. Januar 2012 um 20:42)

  • Wenn ich das von Greenhorn verstanden habe müsste das gesammte Script dann also so aussehen?

    Spoiler anzeigen
    [autoit]

    #Include <WinAPI.au3>

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

    Func DeviceIoControl($hDevice, $dwIoControlCode, $lpInBuffer, $nInBufferSize, $lpOutBuffer, $nOutBufferSize, $lpBytesReturned = 0, $lpOverlapped = 0)
    $Call = DllCall("Kernel32.dll","bool","DeviceIoControl","handle", $hDevice, "dword", $dwIoControlCode, "ptr", $lpInBuffer, _
    "dword", $nInBufferSize, "ptr", $lpOutBuffer, "ptr", $lpBytesReturned, "ptr", $lpOverlapped)
    Return $Call[0]
    EndFunc

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

    $ATKACPIhandle = _WinAPI_CreateFile ("\\.\ATKACPI",2)
    ; Falls Handle nur AutoIt-intern gültig ist, _WinAPI_CreateFile benutzen ...

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

    CtrlACPI(0x44454c4D,1,1)

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

    Func CtrlACPI ($code, $hasArg, $arg)

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

    $bytes = DllStructCreate ("DWORD;")
    $inbuf = DllStructCreate ("DWORD_PTR [5];")
    $cbuf = DllStructCreate ("WORD cmds [2]; DWORD cm2;")
    $outbuf = DllStructCreate ("DWORD [192];")
    ;~ $ret

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

    DllStructSetData ($bytes, 1, 0)

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

    DllStructSetData ($cbuf, "cmds", 0, 1)
    DllStructSetData ($cbuf, "cmds", 0, 2)
    DllStructSetData ($cbuf, "cm2", $arg)

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

    DllStructSetData ($inbuf, 1, 2, 1)
    DllStructSetData ($inbuf, 1, $code, 2)
    DllStructSetData ($inbuf, 1, $hasArg, 3)
    DllStructSetData ($inbuf, 1, 8 * $hasArg, 4)
    DllStructSetData ($inbuf, 1, DllStructGetPtr ($cbuf), 5)

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

    $ret = DeviceIoControl( _
    $ATKACPIhandle, _
    0x222404, _
    $inbuf, _
    DllStructGetSize ($inbuf), _
    DllStructGetPtr ($outbuf), _
    DllStructGetSize ($outbuf), _
    DllStructGetPtr ($bytes), _
    0 _
    )

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

    return $ret

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

    EndFunc

    [/autoit]


    So funktioniert es leider nicht :(. Dort gibt es auch den "AutoIt funktioniert nich mehr"-Fehler.