Variable richtig deklarieren

  • So, habe hier folgendes in C:

    Spoiler anzeigen
    [autoit]


    IOWKIT_HANDLE iows[IOWKIT_MAX_DEVICES];
    int i, j;
    ULONG bits;
    int numIows;
    IOWKIT56_IO_REPORT rep;
    WCHAR sn[9];
    ULONG rc;
    DWORD pid;
    IOWKIT_HANDLE devHandle;

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

    // Get device handle and init object
    iows[i] = IowKitGetDeviceHandle(i + 1);
    // Get serial number
    IowKitGetSerialNumber(iows[i], sn);
    pid = IowKitGetProductId(iows[i]);
    printf("%d PID %x, S/N \"%ws\"\n", i + 1, pid, sn);

    [/autoit]


    Undzwar ist es so, das die Variable sn, als WCHAR sn[9]; Wie schaffe ich das in Autoit?

    Denn ich habe das Problem, das ich als ausgabe nur Mist erhalte, da ich in AutoIt sn nicht richitg deklarieren kann, udn immer nur eine 1 zurück bekomme. Anstadt einer 8 stelligen buchgstabenzahlencombination ;)

    lg Tim

  • In Autoit gibt es deine Variablendeklaration.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • In dem Thread, habe ich auf jedenfall schonmall wertfolle Informationen gefunden. Nun geht es darum, das das Script aber leider bei mir nicht ganz so geht. So kann ich es ausführen:

    Spoiler anzeigen
    [autoit]

    Global $dllIOW, $rslt1IOW, $rslt2IOW, $rslt3IOW, $ptrIOW[16], $snIOW[9]

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

    ;Dll öffnen
    $dllIOW = DllOpen("iowkit.dll")

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

    ;IOWhandle übergeben
    $ptrIOW = DllCall($dllIOW, "ptr", "IowKitOpenDevice")
    If Not IsArray($ptrIOW) Then ConsoleWrite("Mist" & @CRLF)

    ;Anzahl der angeschlossenen Bausteine abfragen
    $rslt1IOW = DllCall($dllIOW, "int", "IowKitGetNumDevs")
    If Not IsArray($rslt1IOW) Then ConsoleWrite("Mist1" & @CRLF)

    ;ProductID abfragen
    $rslt2IOW = DllCall($dllIOW, "dword", "IowKitGetProductId", "ptr", $ptrIOW[0])
    If Not IsArray($rslt2IOW) Then ConsoleWrite("Mist2" & @CRLF)

    ;Seriennummer auslesen
    DllCall($dllIOW, "char", "IowKitGetSerialNumber", "ptr", $ptrIOW[0], "wchar", $snIOW)

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

    ;IOWhandle freigeben
    DllCall($dllIOW, "int", "IowKitCloseDevice", "ptr", $ptrIOW)

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

    ;Dll schließen
    DllClose($dllIOW)

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

    ;Anzeige
    ConsoleWrite("NUM " & $rslt1IOW[0] & @CRLF)
    ConsoleWrite("PID " & "0x" & Hex($rslt2IOW[0]) & @CRLF)
    ConsoleWrite("S/N " & $snIOW & @CRLF)

    [/autoit]


    Ich bekomme von der Konsole folgendes zurück:
    ==========
    NUM 1
    PID 0x00001500
    S/N
    ==========

    Es müsste bei S/N etwas stehen. Nun habe ich den Thread -> Tread gelesen, von dem Ich das obige Script habe, und habe am Ende die Lösung gefunden ->

    Spoiler anzeigen
    [autoit]

    $rslt3IOW = DllCall($dllIOW, "char", "IowKitGetSerialNumber", "ptr", $ptrIOW[0], "wstr", "")
    $snIOW = $rslt3IOW[2]

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

    oder =>

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

    $buffer = DLLStructCreate("wchar[9]")
    $rslt3IOW = DllCall($dllIOW, "char", "IowKitGetSerialNumber", "ptr", $ptrIOW[0], "ptr", DLLStructGetPtr($buffer))
    $snIOW = DllstructGetData($buffer, 1)

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

    So, also habe ich volgendes daraus gemacht:

    Spoiler anzeigen
    [autoit]

    Global $dllIOW, $rslt1IOW, $rslt2IOW, $rslt3IOW, $ptrIOW[16], $snIOW[9], $buffer

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

    ;Dll öffnen
    $dllIOW = DllOpen("iowkit.dll")

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

    ;IOWhandle übergeben
    $ptrIOW = DllCall($dllIOW, "ptr", "IowKitOpenDevice")
    If Not IsArray($ptrIOW) Then ConsoleWrite("Mist" & @CRLF)

    ;Anzahl der angeschlossenen Bausteine abfragen
    $rslt1IOW = DllCall($dllIOW, "int", "IowKitGetNumDevs")
    If Not IsArray($rslt1IOW) Then ConsoleWrite("Mist1" & @CRLF)

    ;ProductID abfragen
    $rslt2IOW = DllCall($dllIOW, "dword", "IowKitGetProductId", "ptr", $ptrIOW[0])
    If Not IsArray($rslt2IOW) Then ConsoleWrite("Mist2" & @CRLF)

    ;Seriennummer auslesen
    $buffer = DLLStructCreate("wchar[9]")
    $rslt3IOW = DllCall($dllIOW, "char", "IowKitGetSerialNumber", "ptr", $ptrIOW[0], "ptr", DLLStructGetPtr($buffer))
    $snIOW = DllstructGetData($buffer, 1)

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

    ;IOWhandle freigeben
    DllCall($dllIOW, "int", "IowKitCloseDevice", "ptr", $ptrIOW)

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

    ;Dll schließen
    DllClose($dllIOW)

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

    ;Anzeige
    ConsoleWrite("NUM " & $rslt1IOW[0] & @CRLF)
    ConsoleWrite("PID " & "0x" & Hex($rslt2IOW[0]) & @CRLF)
    ConsoleWrite("S/N " & $snIOW & @CRLF)

    [/autoit]


    Und bekomme das selbe wie oben zurück. Was habe ich vergessen oder nicht beachtet. Ich habe alle Variablen deklariert, und habe eigentlich doch auf alle sgeachtet, oder?


    lg Tim

    PS: Ja, ich habe auch einen I/O Warrior ;)))

  • mir persönlich fällt da nix falsches auf
    aber ich krieg einen fehlercode

    Spoiler anzeigen


    C:\Users\Alex\Desktop\AutoIt v3 Script (neu) (2).au3 (15) : ==> Subscript used with non-Array variable.:
    $rslt2IOW = DllCall($dllIOW, "dword", "IowKitGetProductId", "ptr", $ptrIOW[0])
    $rslt2IOW = DllCall($dllIOW, "dword", "IowKitGetProductId", "ptr", $ptrIOW^ ERROR
    ->17:13:40 AutoIT3.exe ended.rc:1
    >Exit code: 1 Time: 1.098

  • Ich glaube ohne die Hardware bringt uns die DLL auch nicht weiter ... ;)

    Versuche mal bitte das hier (das Eine oder das Andere):

    Spoiler anzeigen
    [autoit]

    Global $dllIOW, $rslt1IOW, $rslt2IOW, $rslt3IOW, $ptrIOW, $snIOW, $buffer

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

    ;Dll öffnen
    $dllIOW = DllOpen("iowkit.dll")

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

    ;IOWhandle übergeben
    $ptrIOW = DllCall($dllIOW, "ptr", "IowKitOpenDevice")
    If Not IsArray($ptrIOW) Then ConsoleWrite("Mist" & @CRLF)

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

    ;Anzahl der angeschlossenen Bausteine abfragen
    $rslt1IOW = DllCall($dllIOW, "int", "IowKitGetNumDevs")
    If Not IsArray($rslt1IOW) Then ConsoleWrite("Mist1" & @CRLF)

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

    ;ProductID abfragen
    $rslt2IOW = DllCall($dllIOW, "dword", "IowKitGetProductId", "ptr", $ptrIOW[0])
    If Not IsArray($rslt2IOW) Then ConsoleWrite("Mist2" & @CRLF)

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

    ;Seriennummer auslesen
    ; Entweder so ...
    $rslt3IOW = DllCall($dllIOW, "char", "IowKitGetSerialNumber", "ptr", $ptrIOW[0], "wstr", $snIOW)
    $snIOW = $rslt3IOW[2]

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

    ; ... oder so:
    ;~ $buffer = DLLStructCreate("wchar[9]")
    ;~ $rslt3IOW = DllCall($dllIOW, "char", "IowKitGetSerialNumber", "ptr", $ptrIOW[0], "ptr", DllStructGetPtr ($buffer))

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

    ;IOWhandle freigeben
    DllCall($dllIOW, "int", "IowKitCloseDevice", "ptr", $ptrIOW)

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

    ;Dll schließen
    DllClose($dllIOW)

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

    ;Anzeige
    ConsoleWrite("NUM " & $rslt1IOW[0] & @CRLF)
    ConsoleWrite("PID " & "0x" & Hex($rslt2IOW[0]) & @CRLF)
    ConsoleWrite("S/N " & $snIOW & @CRLF)
    ;~ ConsoleWrite("S/N " & DllstructGetData($buffer, 1) & @CRLF)

    [/autoit]


    EDIT:
    Noch eine Zeile vergessen ...


    Gruß
    Greenhorn


  • Hmm komisch, ich habe die dll in den Script-Ordner getan und auch den Pfad nochmal geändert, aber es geht nicht immer den Fehler

    Spoiler anzeigen
    Code
    $rslt2IOW = DllCall($dllIOW, "dword", "IowKitGetProductId", "ptr", $ptrIOW[0])
    $rslt2IOW = DllCall($dllIOW, "dword", "IowKitGetProductId", "ptr", $ptrIOW^ ERROR
    ->20:43:47 AutoIT3.exe ended.rc:1

    mfg. Jam00

  • So, nun aber ... !?

    Spoiler anzeigen
    [autoit]


    Global $dllIOW, $hKitIOW, $iNumDevs, $iProdID, $snIOW, $buffer, $res

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

    ;Dll öffnen
    $dllIOW = DllOpen("D:\A1\AutoIt\Temp\iowkit.dll")
    If ($dllIOW = -1) Then ConsoleWrite("!> Mist, DllOpen fehlgeschlagen..." & @CRLF)

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

    ;IOWhandle übergeben
    $res = DllCall($dllIOW, "PTR", "IowKitOpenDevice")
    If Not IsArray($hKitIOW) Then
    ConsoleWrite("!> Mist, IowKitOpenDevice fehlgeschlagen..." & @CRLF)
    Else
    $hKitIOW = $res[0]
    ;Anzahl der angeschlossenen Bausteine abfragen
    $res = DllCall($dllIOW, "ULONG", "IowKitGetNumDevs")
    If Not IsArray($res) Then
    ; Error handling
    ConsoleWrite("!> Mist, IowKitGetNumDevs fehlgeschlagen..." & @CRLF)
    Else
    $iNumDevs = $res[0]
    EndIf

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

    ;ProductID abfragen
    $res = DllCall($dllIOW, "ULONG", "IowKitGetProductId", "PTR", $hKitIOW[0])
    If Not IsArray($res) Then
    ; Error handling
    ConsoleWrite("!> Mist, IowKitGetProductId fehlgeschlagen..." & @CRLF)
    Else
    $iProdID = $res[0]
    EndIf

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

    ;Seriennummer auslesen
    ; Entweder so ...
    $res = DllCall($dllIOW, "BOOL", "IowKitGetSerialNumber", "PTR", $hKitIOW[0], "WSTR", "")
    If (not @error) Then
    $snIOW = $res[2]
    Else
    $snIOW = "error code: "&@error
    EndIf
    ; ... oder so:
    ;~ $buffer = DLLStructCreate("WCHAR[9]")
    ;~ $res = DllCall($dllIOW, "BOOL", "IowKitGetSerialNumber", "PTR", $hKitIOW[0], "PTR", DllStructGetPtr ($buffer))
    EndIf

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

    ;IOWhandle freigeben
    DllCall($dllIOW, "INT", "IowKitCloseDevice", "PTR", $hKitIOW)

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

    ;Dll schließen
    DllClose($dllIOW)

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

    ;Anzeige
    ConsoleWrite("NUM " & $iNumDevs & @CRLF)
    ConsoleWrite("PID " & "0x" & Hex($iProdID) & @CRLF)
    ConsoleWrite("S/N " & $snIOW & @CRLF)
    ;~ ConsoleWrite("S/N " & DllstructGetData($buffer, 1) & @CRLF)

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

    Jam00, benutzt Du evtl. die 64bit Variante von Windoze ?

    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (2. August 2010 um 22:46)

  • Also wenn ich folgendes ausführe:

    Spoiler anzeigen
    [autoit]

    Global $dllIOW, $hKitIOW, $iNumDevs, $iProdID, $snIOW, $buffer, $res

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

    ;Dll öffnen
    $dllIOW = DllOpen("iowkit.dll")
    If ($dllIOW = -1) Then ConsoleWrite("!> Mist, DllOpen fehlgeschlagen..." & @CRLF)

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

    ;IOWhandle übergeben
    $res = DllCall($dllIOW, "PTR", "IowKitOpenDevice")
    If Not IsArray($hKitIOW) Then
    ConsoleWrite("!> Mist, IowKitOpenDevice fehlgeschlagen..." & @CRLF)
    Else
    $hKitIOW = $res[0]
    ;Anzahl der angeschlossenen Bausteine abfragen
    $res = DllCall($dllIOW, "ULONG", "IowKitGetNumDevs")
    If Not IsArray($res) Then
    ; Error handling
    ConsoleWrite("!> Mist, IowKitGetNumDevs fehlgeschlagen..." & @CRLF)
    Else
    $iNumDevs = $res[0]
    EndIf

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

    ;ProductID abfragen
    $res = DllCall($dllIOW, "ULONG", "IowKitGetProductId", "PTR", $hKitIOW[0])
    If Not IsArray($res) Then
    ; Error handling
    ConsoleWrite("!> Mist, IowKitGetProductId fehlgeschlagen..." & @CRLF)
    Else
    $iProdID = $res[0]
    EndIf

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

    ;Seriennummer auslesen
    ; Entweder so ...
    $res = DllCall($dllIOW, "BOOL", "IowKitGetSerialNumber", "PTR", $hKitIOW[0], "WSTR", "")
    If (not @error) Then
    $snIOW = $res[2]
    Else
    $snIOW = "error code: "&@error
    EndIf
    ; ... oder so:
    ;~ $buffer = DLLStructCreate("WCHAR[9]")
    ;~ $res = DllCall($dllIOW, "BOOL", "IowKitGetSerialNumber", "PTR", $hKitIOW[0], "PTR", DllStructGetPtr ($buffer))
    EndIf

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

    ;IOWhandle freigeben
    DllCall($dllIOW, "INT", "IowKitCloseDevice", "PTR", $hKitIOW)

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

    ;Dll schließen
    DllClose($dllIOW)

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

    ;Anzeige
    ConsoleWrite("NUM " & $iNumDevs & @CRLF)
    ConsoleWrite("PID " & "0x" & Hex($iProdID) & @CRLF)
    ConsoleWrite("S/N " & $snIOW & @CRLF)
    ;~ ConsoleWrite("S/N " & DllstructGetData($buffer, 1) & @CRLF)

    [/autoit]


    Dann bekomme ich folgendes zurück:

    Spoiler anzeigen
    [autoit]

    >"D:\Programme\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\User\Desktop\test2.au3"
    !> Mist, IowKitOpenDevice fehlgeschlagen...
    NUM
    PID 0x00000000
    S/N
    >Exit code: 0 Time: 0.325

    [/autoit]

    Was soll das ? und hast du Jam00 eine Lösung ?

    lg Tim

  • Hi,

    [autoit]


    $hKitIOW = $res[0]

    [/autoit]

    Also das erste Problem ist schon mal, dass du

    [autoit]

    $hKitIOW[0]

    [/autoit]

    schreibst was totaler Quatsch ist, da $hKitIOW kein Array ist!


    Probier folgendes:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $dllIOW, $hKitIOW, $iNumDevs, $iProdID, $snIOW, $buffer, $res

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

    ;Dll öffnen
    $dllIOW = DllOpen("iowkit.dll")
    If ($dllIOW = -1) Then ConsoleWrite("!> Mist, DllOpen fehlgeschlagen..." & @CRLF)

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

    ;IOWhandle übergeben
    $res = DllCall($dllIOW, "PTR", "IowKitOpenDevice")

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

    $hKitIOW = $res[0]
    ;Anzahl der angeschlossenen Bausteine abfragen
    $res = DllCall($dllIOW, "ULONG", "IowKitGetNumDevs")
    If Not IsArray($res) Then
    ; Error handling
    ConsoleWrite("!> Mist, IowKitGetNumDevs fehlgeschlagen..." & @CRLF)
    Else
    $iNumDevs = $res[0]
    EndIf

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

    ;ProductID abfragen
    $res = DllCall($dllIOW, "ULONG", "IowKitGetProductId", "PTR", $hKitIOW)
    If Not IsArray($res) Then
    ; Error handling
    ConsoleWrite("!> Mist, IowKitGetProductId fehlgeschlagen..." & @CRLF)
    Else
    $iProdID = $res[0]
    EndIf

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

    ;Seriennummer auslesen
    ; Entweder so ...
    $buffer = DLLStructCreate("WCHAR[9]")
    $res = DllCall($dllIOW, "BOOL", "IowKitGetSerialNumber", "PTR", $hKitIOW, "PTR", DllStructGetPtr ($buffer))
    If (not @error) Then
    $snIOW = $res[2] ; Hier bitte über _Arraydisplay($res) das richtige auswähle, keine Ahnung welches man hier braucht!!!
    Else
    $snIOW = "error code: "&@error
    EndIf
    ; ... oder so:

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

    ;IOWhandle freigeben
    DllCall($dllIOW, "INT", "IowKitCloseDevice", "PTR", $hKitIOW)

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

    ;Dll schließen
    DllClose($dllIOW)

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

    ;Anzeige
    ConsoleWrite("NUM " & $iNumDevs & @CRLF)
    ConsoleWrite("PID " & "0x" & Hex($iProdID) & @CRLF)
    ConsoleWrite("S/N " & $snIOW & @CRLF)
    ;~ ConsoleWrite("S/N " & DllstructGetData($buffer, 1) & @CRLF)

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

    Beachte den Kommentar in Zeile 34!

    Gruß

    Prajoss

    "Never touch a running System!"