- 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.
Spoiler anzeigen
#include <WinAPI.au3>
#include <Array.au3>
#include <Constants.au3>
Global $Resfile = @ScriptDir & "\Test.dll"
$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)
;#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
;#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
; 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
;#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
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.