Delphi [DLL-Aufruf-Struktur in AutoIt]

  • Hallo liebe Gemeinde,

    Ich müsste euch mit einem Problem belasten und zwar, Ich beschäftige mich momentan mit DMX (-Controllern, Protokoll, Geräte, etc ...).
    Dazu habe Ich hier einen USB-DMX Stecker (USB DMX 1 510 Channels) von IMG-Stage Line (auch MONACOR genannt).

    Ich habe mir die DLL für Entwickler dort runtergeladen und wollte den Controller mit AutoIt ansprechen.
    In Delphi habe Ich einen Code für den Aufruf:

    Code
    function GetDMXInterface: pchar; stdcall; external 'DMX510.dll';
    function SetLevel(a: array of byte): boolean; stdcall; external 'DMX510.dll';
    function GetMaxChannels: integer; external 'DMX510.dll';

    Bei den Funktionen GetDMXInterface & GetMaxChannels hat mit Sprenger120 schon wunderbar geholfen,
    nur bei SetLevel haben wir beide Probleme, diese Funktion ist nähmlich die wichtigste, zum Senden der Kanalwerte (0-255) an die Geräte.

    Erwartet wird bei der Funktion ein Array mit einem Index (Channel-Adresse) sowie Werten (0 ... 255). Also so:

    [autoit]


    $Channel[0 ... 510] = 0 ... 255

    [/autoit]

    Nur wie gebe Ich jetzt dieses Array an die Dll-Funktion (SetLevel).
    Ich könnte mir denken, dass es etwas mit DllStruct zutuen haben könnte, aber Da bin Ich kein Profi.

    Also es wäre Nett, wenn Ihr mir bei dem kleinem Problem helfen könntet

  • Hallo eukalyptus,

    Schonmal Danke :)

    Kannst du mir nurnoch 1 zeigen?
    zb, wie setze Ich bei dem DMX Channel 7 (Array Index 6) den Wert auf 100?

    Sorry, habe noch NIE was mit Structs, etc gehabt :)

    EDIT: Okay, Ich habe es in AutoIt versucht, aber immer beim Setzen bekommt AutoIt einen APPCRASH

    Spoiler anzeigen


    [Blockierte Grafik: http://host-it.tk/images/8f1c2b4f63fb2cde6b047ed58d1e39bb.PNG]

    [autoit]


    #AutoIt3Wrapper_UseX64=n
    #include <Array.au3>

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

    $hDll = DllOpen("DMX510.dll")

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

    $aRet = DllCall($hDll, "str*", "GetDMXInterface")
    If Not IsArray($aRet) Then
    ConsoleWrite("DLL error" & @CRLF)
    Exit
    EndIf

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

    ConsoleWrite("Board:" & $aRet[0] & @CRLF)

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

    $aRet = DllCall($hDll, "int", "GetMaxChannels")
    If Not IsArray($aRet) Then
    ConsoleWrite("DLL error" & @CRLF)
    Exit
    EndIf

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

    ConsoleWrite("Channels:" & $aRet[0] & @CRLF)
    $iDMXChCount = $aRet[0]

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

    ; AB HIER GIBT ES PROBLEME, BIS HIERVOR KLAPPT ALLES WUNDERBAR

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

    $tStructChar = DllStructCreate("Byte[510];")

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

    For $x = 0 To 4
    DllStructSetData($tStructChar, 1, 100, $x)
    Next

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

    DllCall($hDll, "bool", "SetLevel","ptr",DllStructGetPtr($tStructChar))

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

    DllClose($hDll)

    [/autoit]
  • Also erst mal fängt AutoIt bei DLLStruct-Arrays mit 1 an zu zählen. Statt 510 würde ich außerdem mal den Wert von iMaxChannels verwenden, falls der größer ist.