Array aus Dll-Datei laden.

    • Offizieller Beitrag

    Servus.

    Um meine Scripte übersichtlich zu halten habe Ich eine Funktion geschrieben um ein Array aus einer DLL Datei zu laden.
    Das Array ist in der DLL als String Table Resource gespeichert. In der DLL Datei ist es noch kein Array, da solche nicht direkt geladen werden können.
    Die späteren Einträge des Arrays werden wie die Ausgabe von _ArrayToString in der Resource abgelegt.
    Ich hoffe die Funktion kann ausser mir noch jemand brauchen. :thumbup:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <Array.au3>
    #include <Constants.au3>
    Global $Resfile = @ScriptDir & "\Test.dll"

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

    $aTest = _ArrayFromResource($Resfile, 0); 1D Array ohne Index
    _ArrayDisplay($aTest)
    $aTest = _ArrayFromResource($Resfile, 1,True);1D Array mit Index
    _ArrayDisplay($aTest)
    $aTest = _ArrayFromResource($Resfile, 2, False, True);2D Array ohne Index
    _ArrayDisplay($aTest)
    $aTest = _ArrayFromResource($Resfile, 2, True, True);2D Array nit Index
    _ArrayDisplay($aTest)

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

    ;#Function# ============================================================================================================================================
    ; Name............: _ArrayFromResource
    ; Description.....: Lädt ein Array aus einer Resource die als StringTable abgespeichert wurde
    ; Syntax..........: _ArrayFromResource($Resfile , $iStringIdx, $Index = False, $2DArray = False)
    ; Parameters......: $Resfile Dateiname des Resourcefiles, bei -1 wird die Autoit Exe Datei verwendet
    ; $iStringIdx Nummer der StringTable aus dem das Array geladen wird
    ; $Index Bei True wird in Element 0 die Anzahl der Einträge gespeichert
    ; $b2D Bei True wird ein 2D Array aus der Resourcedatei ausgelesen
    ; Return values .:
    ; Success - Das erstellte Array wird zurückgegeben
    ; Failure - 1,2 Das Handle konnte nicht ermittelt werden
    ; - 3 Übergabeparameter $Index ist nicht vom Type Boolean
    ; - 4 Übergabeparameter $b2DArray ist nicht von Type Boolean
    ; - 5 Stringtable aus dem das Array gebildet werden soll, wurde nicht gefunden
    ; - 6,7 Array konnte nicht erstellt werden
    ;
    ; Author ........: [email='Raupi@Autoit.de'][/email]
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......;
    ; ======================================================================================================================================================
    Func _ArrayFromResource($Resfile , $iIndex, $bIndex = False, $b2D = False)
    Local $hInstance, $sText, $aRet
    If $Resfile = -1 Then; Resfile = Executable Autoit Exe
    $hinstance = _WinAPI_GetModuleHandle("")
    If @error Then Return SetError(1, 0, 0)
    Else
    $hinstance = _WinAPI_LoadLibrary($Resfile)
    If @error Then Return SetError(2, 0, 0)
    EndIf
    If Not IsBool($bIndex) Then Return SetError(3, 0, 0)
    If Not IsBool($b2D) Then Return SetError(4, 0, 0)
    $sText = _WinAPI_LoadString($hInstance, $iIndex)
    If @error Then Return SetError(5, 0, 0)
    If $b2D = False Then ; Ziellarray soll ein 1D Array sein
    If $bIndex = True Then $aRet = StringSplit($sText, "|", 0); Erstellen mit Index
    If $bIndex = False Then $aRet = StringSplit($sText, "|", 2); Erstellen ohne Index
    If Not IsArray($aRet) Then Return SetError(6, 0, 0)
    Return $aRet
    Else
    $aRet = _String2Array2D($sText, '|', ',', $bIndex); 2D Array aus String erstellen
    If Not IsArray($aRet) Then Return SetError(7, 0, 0)
    Return $aRet
    EndIf
    If $Resfile <> -1 Then _WinAPI_FreeLibrary($hInstance)
    EndFunc ;==>_ArrayFromResource

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

    ;#Function# ============================================================================================================================================
    ; Name............: _Array2D2String
    ; Description.....: Wandelt ein 2D Array in einen String um
    ; Syntax..........: _Array2D2String($Array, $iStart = 0, $iEnd = 0, $DelimRow = '|', $DelimCol = ',')
    ; Parameters......:
    ; $Array - Array das umgewandelt werden soll
    ; $iStart - [optional] Index ab welchem gestartet werden soll
    ; $iEnd - [optional] Index bis zu welchem verarbeitet werden soll
    ; $DelimRow - [optional] Seperator für Rows
    ; $DelimCol - [optional] Seperator für Colums
    ; Return values .:
    ; Success - String mit dem Inhalt des Array´s
    ; Failure - 1 Übergebenes Array ist kein Array

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

    ; Author ........: [email='BugFix@Autoit.de'][/email]
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......;
    ; ======================================================================================================================================================
    Func _Array2D2String($Array, $iStart = 0, $iEnd = 0, $DelimRow = '|', $DelimCol = ','); Funktion zum erstellen eines Strings von einem 2D Array (c) BugFix
    If Not IsArray($Array) Then Return SetError(1, 0, 0)
    Local $sOut = ''
    If $iStart < 0 Then $iStart = 0
    If $iEnd = 0 Or $iEnd > UBound($Array) - 1 Then $iEnd = UBound($Array) - 1
    For $i = $iStart To $iEnd
    For $j = 0 To UBound($Array, 2) - 1
    $sOut &= $Array[$i][$j] & $DelimCol
    Next
    $sOut = StringTrimRight($sOut, 1) & $DelimRow
    Next
    Return StringTrimRight($sOut, 1)
    EndFunc ;==>_Array2D2String

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

    ;#Function# ============================================================================================================================================
    ; Name............: _String2Array2D
    ; Description.....: Wandel einen mit _Array2D2String konvertierten String in ein Array um.
    ; Syntax..........: _String2Array2D($string, $DelimRow = '|', $DelimCol = ',', $nIndex = False)
    ; Parameters......:
    ; $string - Umzuwandelnder String
    ; $DelimRow - [optional] Seperator für Rows
    ; $DelimCol - [optional] Seperator für Colomns
    ; $bIndex - [optional] Index mit Anzahl der enthaltenen Einträge wird erstellt. False = kein Index erstellen
    ; Return values .:
    ; Success - Array das erstellt wurde
    ; Failure - 1 Parameter $bIndex ist nicht vom Type Boolean
    ; - 2 Row Split nicht erfolgreich
    ; - 3 Column Split nicht erfolgreich
    ; Author ........: [email='BugFix@Autoit.de'][/email]
    ; Modified.......: [email='Raupi@Autoit.de'][/email]
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......;
    ; ======================================================================================================================================================
    Func _String2Array2D($string, $DelimRow = '|', $DelimCol = ',', $Idx = False); Funktion von BugFix erweitert von Raupi
    If Not IsBool($Idx) Then Return SetError(1, 0, 0)
    Local $tmp = StringSplit($string, $DelimRow, 2)
    If @error then Return Seterror(2,0,0)
    Local $tmp1 = StringSplit($tmp[0], $DelimCol, 2)
    If @error then Return Seterror(3,0,0)
    Local $aOut[UBound($tmp) + $Idx][UBound($tmp1)]
    For $i = 0 To UBound($tmp) - 1
    $tmp1 = StringSplit($tmp[$i], $DelimCol, 2)
    For $j = 0 To UBound($tmp1) - 1
    $aOut[$i + $Idx][$j] = $tmp1[$j]
    Next
    Next
    If $Idx = True Then $aOut[0][0] = UBound($aOut, 1) - 1
    Return $aOut
    EndFunc ;==>_String2Array2D

    [/autoit]


    Eine Test DLL-Datei hänge ich mal an.


    Edit: Habe das Beispiel erweitert. Es können auch 2D Arrays aus einer DLL geladen werden.
    Edit2: Funktionheader hinzugefügt und Fehler in der Resourcenfreigabe behoben.
    Zum erstellen des Strings aus dem 2D Array kann _Array2D2String verwendet werden. Dank an BugFix, der die Funktionen _Array2D2String und _String2Array2D für mich geschrieben hat. :thumbup:

    • Offizieller Beitrag

    Beispiel erweitert, es können auch 2D Array´s aus der DLL geladen werden.
    Siehe Post 1.

  • Ich muss sagen, dass ich die UDF besonders nützlich finde. :thumbup:
    Leider bin ich jedoch nicht sonderbar versiert im Umgang mit C++ (und der DLL-Erstellung) :S ...
    Könntest du vielleicht den Quellcode von der Test.dll dazuposten?
    Ich würde manche "Operationen" gerne in C++ auslagern, nur kann ich das leider nicht in AutoIt importieren.
    Mit dem Array-Import würde mir sehr geholfen werden. Ein simples Beispiel mit einem Char/String - Array
    und/oder einem int - Array als Dll und deren Aufruf in AutoIt (dllcall) würde mir sehr helfen.
    Vielen Dank für die Mühe! :)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    • Offizieller Beitrag

    Du brauchst keine C Kenntnisse. Benutze doch einfach den Xn Resource Editor :http://www.wilsonc.demon.co.uk/d10resourceeditor.htm

    Zusätzlich brauchst du noch eine Leer DLL oder benutze meine Test.dll und lösche einfach die Resourcen die du nicht brauchst.
    Die Arrays kannst du mit _ArraytoString oder _Array2D2String in einen String umwandeln. String in die Zwischenablage kopieren und per Strg-V in den Resourceeditor einfügen. So hab ich das gemacht.
    Wie aus dem String wieder ein Array wird kannst du ja im Beispiel sehen.


    Edit: Mit C hab ich nix am Hut, das hab ich zuletzt vor 20 Jahren benutzt. Zu viele Klammern :thumbdown:

    • Offizieller Beitrag

    Funktionheader hinzugefügt und Fehler in der Resourcenfreigabe behoben.
    Siehe Post 1.