1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Indi2Go

Beiträge von Indi2Go

  • DLLCall mit Pointer auf Struktur-Array

    • Indi2Go
    • 15. Dezember 2013 um 10:33

    Hi,
    danke für die schnelle Antwort!

    Zitat

    Um Gottes willen! Nein,... Auf keinen Fall so xD
    Du musst die Struktur glücklicherweise nur ein einziges mal eintippen

    Darauf bin ich eh nicht scharf... ^^

    Aber ich bin mir in dem Fall nicht sicher, da das eine C-Struktur ist, wie das mit dem "alignment" läuft.
    Oder da die Struktur nur aus durch 8 teilbare Anzahl von char-Arrays besteht brauch ich mir da keine Gedanken machen?

    Bezüglich des Aufrufs.
    Das "Struktur-Array" wird von der DLL-Funktion gefüllt. Es wird der Pointer auf das erste (Struktur-)Element und die Größe der Elemente angegeben. Falls die Funktion mehr Geräte finden sollte wird diese Anzahl zurückgegeben, aber eben nur die max. Anzahl an Strukturelementen befüllt.
    Nach dem Aufrufen steht in dem Struktur-array die Daten der gefundenen Geräte.

    Wenn ich das ganze in einem Array, so wie Du angegebn hast, steht das so hintereinander im Speicher wie in 'C'? Damit wenn die (DLL-)Funktion mit dem Pointer weitergeht die nächste Struktur ausgefüllt wird?

    Ich stell mir das so vor (aber ob das funzt?):
    (ist mal nur graue theorie, da heute ja SO & ich das erst morgen ausprobieren kann...)

    Spoiler anzeigen
    [autoit]


    Global $i, $atDDA[5], $pStruct, $avRet, $ccSNR[5]
    Global $tagDDA = 'ULONG snr;' & _
    'CHAR name[256];' & _
    'int dhcp;' & _
    'CHAR ip[24];' & _
    'CHAR netmask[24];' & _
    'CHAR gateway[24];' & _
    'int signature'
    Global $tDDA = DllStructCreate($tagDDA)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    For $i = 0 To UBound($atDDA) -1
    $atDDA[$i] = $tDDA
    Next

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $pStruct = DllStructGetPtr($atDDA[0])
    $avRet = DllCall('ChipControl.dll', 'int', 'CCGetAllDevsInArray', 'ptr', $pStruct, 'int', UBound($atDDA))

    if $avRet[0] > UBound($atDDA) then
    MsgBox(64,"CC-Scan", $avRet[0] & " Geräte gefunden!")
    EndIf
    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    For $i = 0 To $avRet[0]
    $ccSNR[$i] = DllStructGetData($tDDA[$i],'snr') ;Hier bin ich mir sehr unsicher, ob das so geht!
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • DLLCall mit Pointer auf Struktur-Array

    • Indi2Go
    • 15. Dezember 2013 um 01:01

    Ich möchte eine DLL-Funktion einbinden die einen Pointer auf ein Struktur-Array erwartet. (+max. Anzahl der Strukturen) . Für jedes gefundene Gerät wird eine Struktur ausgefüllt.
    Die Funktion gibt die Anzahl der ausgefüllten Strukturen nach dem Aufruf zurück.
    In C schaut das ca. so aus:

    Spoiler anzeigen
    Code
    struct 
    {
        unsigned long snr;
        char name[256];
        int dhcp;
        char ip[24];
        char netmask[24];
        char gateway[24];
        int signature;
    }DevDataRecord
    
    
    DevDataRecord dda[4];        // create DevData array
    int numOfDevs = CCGetAllDevsInArray(&dda[0], 4); // get all found devices
    // dda[0].snr ... serial number first found device
    // dda[1].snr ... serial number second found device
    Alles anzeigen

    Wenn ich die DLL nun in AutoIt benutzen will wie muss ich da jetzt mit "DllStructCreate" die Struktur erstellen?
    Muss ich da jetzt 5mal hintereinander die daten eintippen?

    Spoiler anzeigen
    [autoit]


    Local $tagDDA=""
    $tagDDA &= "STRUCT; ULONG snr1; CHAR name1[256]; int dhcp1; CHAR ip1[24]; char netmask1[24]; char gateway1[24]; int signature1; ENDSTRUCT"
    $tagDDA &= "STRUCT; ULONG snr2; CHAR name2[256]; int dhcp2; CHAR ip2[24]; char netmask2[24]; char gateway2[24]; int signature2; ENDSTRUCT"
    $tagDDA &= "STRUCT; ULONG snr3; CHAR name3[256]; int dhcp3; CHAR ip3[24]; char netmask3[24]; char gateway3[24]; int signature3; ENDSTRUCT"
    $tagDDA &= "STRUCT; ULONG snr4; CHAR name4[256]; int dhcp4; CHAR ip4[24]; char netmask4[24]; char gateway4[24]; int signature4; ENDSTRUCT"

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

    Local $DDA_struct = DLLSTRUCTCREATE($tagDDA)

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

    Local $aReturn = DllCall('ChipControl.dll', 'int', 'CCGetAllDevsInArray', 'struct*', $DDA_struct, 'int', 4)

    [/autoit]

    Da ich momentan nur ein Device habe das gefunden wird kann ich es nicht ausprobieren ob es so passt.
    Bzw. gibt es eine Möglichkeit das ich so a la DDA[1].snr darauf zugreifen kann?

    Bzw. noch eine andere Frage, bin nicht so fix mit den Pointern :S
    Sind die beiden Varianten beim DllCall gleichwertig?

    [autoit]


    Local $aReturn = DllCall('ChipControl.dll', 'int', 'CCGetAllDevsInArray', 'struct*', $DDA_struct, 'int', 4)
    bzw.
    Local $aReturn = DllCall('ChipControl.dll', 'int', 'CCGetAllDevsInArray', 'ptr', DllStructGetPtr($DDA_struct), 'int', 4)

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


    THX,
    Indi2Go

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™