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. Oscar

Beiträge von Oscar

  • [offen] Kompilieren für x86 ?

    • Oscar
    • 30. Mai 2020 um 13:37

    Ich hab's geschafft, eine 32Bit-Dll zu erstellen und mit AutoIt nutzen zu können. Und zwar habe ich die 32Bit-Version und die 64Bit-Version von mingw gemäß dieser Anleitung installiert: https://github.com/khchen/winim (ganz unten bei: Cross Compile)

    Hinweis: <USER> mit eurem Usernamen ersetzen!

    Bei mir liegen jetzt also im Verzeichnis c:\Users\<USER>\.choosenim\toolchains\nim-1.2.0\dist\ zusätzlich zum "nimble"-Ordner, die beiden Ordner "mingw64" und "mingw32".

    Dann im Verzeichnis c:\Users\<USER>\.choosenim\toolchains\nim-1.2.0\config\ die Datei "nim.cfg" ändern. Ab Zeile 162 muss da jetzt folgendes stehen:

    Code
    # Configuration for the GNU C/C++ compiler:
    @if windows:
      @if i386:
        gcc.path = r"$nim\dist\mingw32\bin"
      @else:
        gcc.path = r"$nim\dist\mingw64\bin"
      @end
      @if gcc or tcc:
        tlsEmulation:on
      @end
    @end
    Alles anzeigen

    Und dann den Compiler mit dieser Zeile starten: nim c -d:release --cpu:i386 -o:math32.dll program.nim

    Ja, ganz wichtig, ohne "--app:lib"!

    "program.nim" ist die von BugFix erstellte Nim-Dll:

    Code
    proc addiere(p1, p2: int): int {.stdcall, exportc, dynlib.} =
      p1 + p2
    
    proc subtrahiere(p1, p2: int): int {.stdcall, exportc, dynlib.} =
      p1 - p2
    
    proc multipliziere(p1, p2: int): int {.stdcall, exportc, dynlib.} =
      p1 * p2
    
    proc dividiere(p1, p2: float): float {.stdcall, exportc, dynlib.} =
      p1 / p2
    Alles anzeigen

    So wurde die Dll zumindest schonmal in AutoIt erfolgreich geladen.

    Im Hex-Editor habe ich dann die "falschen" Funktionsnamen gesehen (wie BugFix schon schrieb). Also habe ich in AutoIt die Funktionen auch mit diesen "falschen" Namen aufgerufen und das funktionierte dann.

    AutoIt
    #AutoIt3Wrapper_UseX64=n
    
    Local $hDll = DllOpen(@ScriptDir & "\math32.dll")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hDll = ' & $hDll & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Local $aRes, $a = 9, $b = 18
    
    $aRes = DllCall($hDll, 'int', 'addiere@8', 'int', $a, 'int', $b)
    If Not @error Then ConsoleWrite('addiere ' & $aRes[0] & @CRLF)
    
    $aRes = DllCall($hDll, 'int', 'subtrahiere@8', 'int', $a, 'int', $b)
    If Not @error Then ConsoleWrite('subtrahiere ' & $aRes[0] & @CRLF)
    
    $aRes = DllCall($hDll, 'int', 'multipliziere@8', 'int', $a, 'int', $b)
    If Not @error Then ConsoleWrite('multipliziere ' & $aRes[0] & @CRLF)
    
    $aRes = DllCall($hDll, 'double', 'dividiere@16', 'double', $a, 'double', $b)
    If Not @error Then ConsoleWrite('dividiere ' & $aRes[0] & @CRLF)
    
    DllClose($hDll)
    Alles anzeigen
  • [Nim] und die BASS-Dll

    • Oscar
    • 29. Mai 2020 um 14:00
    Zitat von Bitnugger

    Ich bekomme es einfach nicht hin, dass BASS_StreamCreateFile Dateien abspielt, die UTF-8-Zeichen im Dateipfad haben.

    Zitat von Bitnugger

    Bei diesem Namen ist es mir aufgefallen: Louisa Johnson - Who’s Loving You.m4a

    Ich habe jetzt noch diverse Versuche unternommen. So funktioniert es jetzt bei mir:

    Code
    import os
    import nimbass/bass
    import winim
    include winim/[inc\windef, inc\mmsystem]
    
    # Audiogeraet initialisieren
    discard BASS_Init(cint(-1), bass.DWORD(44100), bass.DWORD(0), bass.DWORD(0), nil)
    
    # Gesamtlautstaerke aendern (0 - 1.0)
    discard BASS_SetVolume(1.0)
    
    # die BASS-dll ist in C geschrieben, deswegen die C-Variablen
    var 
        iLen: QWORD
        iSeconds, iSecondsNow: cdouble
        fBitrate, fVolume: cfloat
    
    # hier als Datentyp LPCWSTR angeben
    let sSndFile: LPCWSTR = r"Louisa Johnson - Who’s Loving You.m4a"
    
    # MP3-File als Stream in den Speicher laden (wird am Ende automatisch freigegeben)
    # BASS_UNICODE als zusaetzlichen Style
    let hChannel = BASS_StreamCreateFile(false, sSndFile, 0, 0, bass.DWORD(BASS_STREAM_PRESCAN or BASS_STREAM_AUTOFREE or BASS_UNICODE))
    
    # die Laufzeit des Streams auslesen (in Bytes)
    iLen = BASS_ChannelGetLength(hChannel, BASS_POS_BYTE)
    echo "Laenge in Bytes: " & $iLen
    
    # die Laufzeit in Sekunden umrechnen
    iSeconds = BASS_ChannelBytes2Seconds(hChannel, iLen)
    echo "Laenge in Sekunden: " & $int(iSeconds)
    
    if BASS_ChannelPlay(hChannel, false):
        while true:
            case BASS_ChannelIsActive(hChannel) # liefert ein DWORD zurueck
            of BASS_ACTIVE_PLAYING:             # Player noch aktiv
                iLen = BASS_ChannelGetPosition(hChannel, BASS_POS_BYTE)
                iSecondsNow = BASS_ChannelBytes2Seconds(hChannel, iLen)
                echo "Position: " & $int(iSecondsNow) & " / " & $int(iSeconds)
                sleep(1000)                     # eine Sekunde warten 
            of BASS_ACTIVE_STOPPED: break       # Player Stop
            of BASS_ACTIVE_PAUSED: break        # Player Pause
            of BASS_ACTIVE_PAUSED_DEVICE: break # Device Pause
            of BASS_ACTIVE_STALLED: break       # Datenstrom unterbrochen
            else: break                         # ansonsten die While-Schleife beenden
    discard BASS_ChannelStop(hChannel)
    discard BASS_Free()
    Alles anzeigen
  • [Nim] und die BASS-Dll

    • Oscar
    • 28. Mai 2020 um 12:49
    Zitat von alpines

    OT: Uiuiuiuiuiui, da wäre ich ganz vorsichtig. Bei einigen Leuten grenzt das Thema schon an religiösem Fanatismus

    Naja, selbst schuld, würde ich sagen.

    Alle nicht ANSI-Zeichen machen immer wieder auf irgendwelchen Geräten Probleme. Zumindest meiner Erfahrung nach. Smartphone, MP3-Player, Autoradio, Fernseher, ganz egal, irgendwo hakt es immer.

    Ich habe meine MP3-Sammlung jedenfalls ANSI-konform erstellt und seitdem keinerlei Probleme. Wobei ich durchaus auch Leerzeichen im Dateinamen verwende.

  • [Nim] paramStr() / getFileInfo() zickt rum...

    • Oscar
    • 27. Mai 2020 um 08:34

    Um ein einzelnes Zeichen ("char") zu vergleichen, musst Du nicht alles nach "string" konvertieren. Es reicht: sPath[^1] == chr(34)

    So musst Du auch nicht mit dem Bereich tricksen ("sPath[^1..^1]").

    Das Ergebnis kannst Du dann in einen String wandeln (wegen "echo"):

    echo "sPath[^1] == chr(34) = " & $(sPath[^1] == chr(34))

  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 26. Mai 2020 um 12:47
    Zitat von Bitnugger

    Habe es gerade getestet... es geht auch ohne Konvertierung nach int, wenn du bei type int32 nimmst:

    Ja, das geht, aber dann meckert wNim, weil dort bei pos und size die INTs 64-Bits haben.

    Und da ich die Funktion zum positionieren von einem wNim-Frame brauche, habe ich gleich nach INT konvertiert.

  • [Nim] paramStr() / getFileInfo() zickt rum...

    • Oscar
    • 26. Mai 2020 um 12:42
    Zitat von Bitnugger

    Eigentlich will ich nur wissen, ob der übergebene Parameter ein Verzeichnis oder ein File ist

    Das geht auch einfacher:

    Code
    include winim/[inc\shellapi]
    
    let sPath: cstring = r"d:\Temp\test"
    var bDir = PathIsDirectoryA(sPath) == FILE_ATTRIBUTE_DIRECTORY
    echo bDir
  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 26. Mai 2020 um 11:55
    Zitat von Bitnugger

    Jetzt noch GetMonitorInfo hinzufügen, um rcWork und dwFlags zu bekommen, dann wäre es perfekt...

    Um mal auf Post#13 zurückzukommen. Das habe ich mittlerweile auch hinbekommen:

    Code
    include winim/[inc\winuser]
    
    # Monitor-Objekt definieren (zum speichern der Werte)
    type oMonitor = object
      hMon: HMONITOR
      monitor: RECT
      work: RECT
      flags: DWORD
      pos: (int, int)
      size: (int, int)
    
    # Eine Sequenz (var. Array), um die Monitor-Objekte zu speichern
    var aDispInfo = newSeq[oMonitor]()
    
    # MONITORINFO-Struktur erstellen
    var tMonitorInfo: MONITORINFO
    tMonitorInfo.cbSize = DWORD(sizeof(MONITORINFO))
    
    # Callback-Funktion (wird einmal pro angeschlossenen Monitor aufgerufen)
    proc myEnumProc(hMonitor: HMONITOR,hDC: HDC,rect: LPRECT,lparam: LPARAM): WINBOOL {.stdcall.} =
      GetMonitorInfoA(hMonitor, tMonitorInfo.addr())
      aDispInfo.add(
        oMonitor(hMon: hMonitor,
                monitor: tMonitorInfo.rcMonitor,
                work: tMonitorInfo.rcWork,
                flags: tMonitorInfo.dwFlags,
                pos: (int(rect.left), int(rect.top)),
                size: (int(rect.right - rect.left), 
                       int(rect.bottom - rect.top))
                ))
      return TRUE
    
    # Hiermit werden die Monitordaten geholt
    EnumDisplayMonitors(0, nil, myEnumProc, 0)
    
    # Debugausgabe von allen angeschlossenen Monitoren
    for i, oDisp in aDispInfo:
      echo "Display: " & $i
      echo oDisp
    Alles anzeigen
  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 26. Mai 2020 um 11:23
    Zitat von Bitnugger

    ==>> rect.left = LONG

    Stiimmt! LONG in C ist ja int32.

    Manchmal komme ich da etwas durcheinander mit den Datentypen.

  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 26. Mai 2020 um 11:05
    Zitat von Bitnugger

    Nun, ich dachte erst, weil du ja hier pos und size als int deklariert hast...

    Achso! Ja, ich hatte das vorher ohne explizit zu casten, aber dann meckerte der Compiler wegen "int" <> "int32".

    EnumDisplayMonitor liefert da wohl ein "int32" zurück, "int" ist aber 64-Bit-Int.

  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 26. Mai 2020 um 08:42
    Zitat von Bitnugger

    Ganz schön tricky...

    Ich verstehe jetzt nicht so ganz, was Du mir damit sagen willst!?

  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 25. Mai 2020 um 08:18
    Zitat von BugFix

    Array ist hier zu unflexibel (Datentypen kann man nicht mixen), wozu gibt es Objekte?

    So habe ich wenigstens gleich auch verstanden, wie man ein Array von Objekten erstellt.

    Und weil ich für mein Projekt sowieso eher die Position und die Größe der Monitore brauche, habe ich das mal dahin umgestellt:

    Code
    include winim/[inc\winuser]
    
    # Monitor-Objekt definieren (zum speichern der Werte)
    type oMonitor = object
      hMon: HMONITOR
      pos: (int, int)
      size: (int, int)
    
    # Eine Sequenz (var. Array), um die Monitor-Objekte zu speichern
    var aDispInfo = newSeq[oMonitor]()
    
    # Callback-Funktion (wird einmal pro angeschlossenen Monitor aufgerufen)
    proc myEnumProc(hMonitor: HMONITOR,hDC: HDC,rect: LPRECT,lparam: LPARAM): WINBOOL {.stdcall.} =
      aDispInfo.add(
        oMonitor(hMon: hMonitor,
                pos: (int(rect.left), int(rect.top)),
                size: (int(rect.right - rect.left), 
                       int(rect.bottom - rect.top))
                ))
      return TRUE
    
    # Hiermit werden die Monitordaten geholt
    EnumDisplayMonitors(0, nil, myEnumProc, 0)
    
    # Debugausgabe von allen angeschlossenen Monitoren
    for i, oDisp in aDispInfo:
      echo "Display: " & $i
      echo oDisp
    Alles anzeigen
  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 24. Mai 2020 um 15:24
    Zitat von BugFix

    Array ist hier zu unflexibel (Datentypen kann man nicht mixen), wozu gibt es Objekte?

    Wow! Ja, so ist es natürlich noch besser! :thumbup:


    Zitat von BugFix

    Monitor 2 ist gespiegelt angeschlossen: wird nicht erkannt

    Wenn Du mit "gespiegelt" dupliziert meinst, dann muss der Monitor ja auch nicht erkannt werden.

    Ich denke, das ist so gewollt.

  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 24. Mai 2020 um 09:44
    Zitat von Bitnugger

    Hm, die Werte sind bei mir identisch, egal ob mit oder ohne DC.

    Hmm...Du hast recht.

    Irgendwie hatte ich bei meinen Tests da mal andere Werte. Ich weiß aber nicht mehr, was ich da gerade ausprobiert hatte.

    Jetzt bekomme ich hier auch die gleichen Werte (egal, ob mit oder ohne DC).

    Na gut, dann geht es also noch kürzer. Ich ändere mein obiges Beispiel.

    Danke! :):thumbup:

  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 24. Mai 2020 um 09:06

    Den Desktop-DC braucht man schon, damit die Werte relativ zum primären Monitor sind.

    Ansonsten kannst Du evtl. benötigte Fenster nicht auf die anderen Monitore verschieben.

    Mit "hDC = 0" sind die Werte relativ zum virtuellen Desktop (immer positiv).

    Ich habe mein Programm noch etwas kommentiert und das Monitor-Handle mit abgespeichert:

    Code
    include winim/[inc\winuser]
    import strutils
    
    # globale Variablen, um die Werte zu speichern
    var
        aDispInfo: array[0..5, array[0..6, int]] # 0..5 = max. 6 Monitore
        iDispCount: int
    
    # Callback-Funktion (wird einmal pro angeschlossenen Monitor aufgerufen)
    proc MyEnumProc(hMonitor: HMONITOR,hDC: HDC,rect: LPRECT,lparam: LPARAM): WINBOOL {.stdcall.} =
        if iDispCount >= aDispInfo.len - 1: return FALSE # damit kein "out of bounds" auftritt
        aDispInfo[iDispCount][0] = hMonitor
        aDispInfo[iDispCount][1] = rect.left
        aDispInfo[iDispCount][2] = rect.top
        aDispInfo[iDispCount][3] = rect.right
        aDispInfo[iDispCount][4] = rect.bottom
        aDispInfo[iDispCount][5] = rect.right - rect.left # = width
        aDispInfo[iDispCount][6] = rect.bottom - rect.top # = height
        inc(iDispCount)
        return TRUE
    
    iDispCount = 0
    EnumDisplayMonitors(0, nil, MyEnumProc, 0)
    
    # Debugausgabe:
    for i in 0..iDispCount - 1:
        echo "Display: " & $i
        echo "Handle: 0x" & toHex(aDispInfo[i][0])
        echo "Left: " & $aDispInfo[i][1]
        echo "Top: " & $aDispInfo[i][2]
        echo "Right: " & $aDispInfo[i][3]
        echo "Bottom: " & $aDispInfo[i][4]
        echo "Resolution: " & $aDispInfo[i][5] & " x " & $aDispInfo[i][6]
    Alles anzeigen
  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 23. Mai 2020 um 14:31

    Klasse! Mit dieser Vorlage habe ich die Daten auslesen können.

    Ich hab's noch etwas abgeändert, so dass ich die benötigten Werte in einem Array habe:

    Code
    include winim/[inc\winuser]
    
    var
      aRect: array[0..3, array[0..3, int]]
      iCount: int = 0
    
    proc MyInfoEnumProc(hMonitor: HMONITOR,hDC: HDC,rect: LPRECT,lparam: LPARAM): WINBOOL {.stdcall.} =
      aRect[iCount][0] = rect.left
      aRect[iCount][1] = rect.top
      aRect[iCount][2] = rect.right
      aRect[iCount][3] = rect.bottom
      iCount += 1
      return TRUE
    
    var 
      lpfnenum = MyInfoEnumProc        # callbackfunktion
      data: LPARAM
    let 
      dcScreen = GetDC(0)              # DC Desktop
    
    EnumDisplayMonitors(dcScreen, nil, lpfnenum, data)
    
    ReleaseDC(0, dcScreen)
    
    for i in 0..iCount - 1:
      echo "Display " & $i
      echo aRect[i][0]
      echo aRect[i][1]
      echo aRect[i][2]
      echo aRect[i][3]
    Alles anzeigen

    BugFix : Vielen Dank für Deine Hilfe! :):thumbup:

  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 22. Mai 2020 um 18:17

    Was ich brauche, ist EnumDisplayMonitors. Gefunden habe ich das auch schon in winuser.nim.

    Laut MSDN brauche ich:

    Code
    BOOL EnumDisplayMonitors(
      HDC             hdc,
      LPCRECT         lprcClip,
      MONITORENUMPROC lpfnEnum,
      LPARAM          dwData
    );

    Als Aufruf für alle Monitore:

    Code
    EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);  

    Wobei "MyInfoEnumProc" ein Pointer auf eine Callback-Function (MONITORENUMPROC) ist.

    Dort bekomme ich einen Pointer auf eine RECT-Struktur, zu jedem angeschlossenen Monitor.

    Leider finde ich keinen Nim-Beispielcode dafür.

    In AutoIt habe ich sowas schonmal geschrieben:

    AutoIt
    #include <Array.au3>
    #include <WinAPIGdi.au3>
    
    Global $aData = _CheckMonitor(), $iX = -1, $iY = -1
    If @error Then Exit
    _ArrayDisplay($aData, '_WinAPI_EnumDisplayMonitors')
    ;~ For $i = 1 To $aData[0][0]
    ;~     If $aData[$i][3] >= 1920 And $aData[$i][4] >= 1080 Then
    ;~         $iX = $aData[$i][1]
    ;~         $iY = $aData[$i][2]
    ;~         ExitLoop
    ;~     EndIf
    ;~ Next
    ;~ If $iX = -1 Then Exit
    ;~ ConsoleWrite(StringFormat('X: %i   Y: %i\n', $iX, $iY))
    
    Func _CheckMonitor()
        Local $aPos, $aData = _WinAPI_EnumDisplayMonitors()
        If IsArray($aData) Then
            ReDim $aData[$aData[0][0] + 1][5]
            For $i = 1 To $aData[0][0]
                $aPos = _WinAPI_GetPosFromRect($aData[$i][1])
                For $j = 0 To 3
                    $aData[$i][$j + 1] = $aPos[$j]
                Next
            Next
            Return SetError(0, 0, $aData)
        Else
            Return SetError(1, 0, 0)
        EndIf
    EndFunc
    Alles anzeigen

    Kann mir jemand mit Nim behilflich sein?

  • Wifi Daten auslesen

    • Oscar
    • 22. Mai 2020 um 17:40

    Da musst Du schon konkreter werden.

    Was ist das für ein Gerät? Und wie kommuniziert es?

  • [Nim] Multi-Monitor-Auswahl

    • Oscar
    • 21. Mai 2020 um 18:28

    Wie kann ich mir mit Nim die Auflösung der angeschlossenen Monitore (und deren Position) anzeigen lassen?

    Mit wGetScreenSize() bekomme ich nur die Größe des Haupt-Bildschirms. Ein zusätzlicher Monitor, der sich links daneben befindet, wird mir nicht angezeigt.

  • Ausbalanzierte Stringsequenzen

    • Oscar
    • 20. Mai 2020 um 15:09

    Ich würde die Zeile einfach von links nach rechts durchgehen. Es gibt ja "nur" zwei Zeichen (chr(34) und chr(39)), die einen String kennzeichnen.

    Wenn eines der beiden Zeichen auftritt, einen Startpunkt setzen und darauf warten, dass das Zeichen ein zweites Mal auftaucht. Bis dahin ist es dann ein String.

    Hier mal als AutoIt-Code:

    AutoIt
    $sData = FileRead(@ScriptDir & '\test.txt')
    $sRet = _GetStrings($sData)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sRet = ' & $sRet & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    Func _GetStrings($sData)
        Local Const $sStart = Chr(2), $sEnd = Chr(3)
        Local $iStart = 1, $sRet = '', $iStr = 0
        For $iIndex = 1 To StringLen($sData)
            Switch StringMid($sData, $iIndex, 1)
                Case ';'
                    ; wenn ein Semikolon ausserhalb von Strings erkannt wird,
                    ; dann ist es der Anfang vom Zeilenkommentar
                    If $iStr == 0 Then ExitLoop
                Case Chr(39) ; Zeichen: '
                    If $iStr == 1 Then ; wenn das zweite ' auftaucht
                        $sRet &= $sStart & StringMid($sData, $iStart, $iIndex - $iStart) & $sEnd
                        $iStr = 0
                        ContinueLoop
                    EndIf
                    If $iStr == 0 Then
                        If $iIndex + 1 <= StringLen($sData) Then
                            $iStart = $iIndex + 1
                            $iStr = 1
                        EndIf
                    EndIf
                Case Chr(34) ; Zeichen: "
                    If $iStr == 2 Then ; wenn das zweite " auftaucht
                        $sRet &= $sStart & StringMid($sData, $iStart, $iIndex - $iStart) & $sEnd
                        $iStr = 0
                        ContinueLoop
                    EndIf
                    If $iStr == 0 Then
                        If $iIndex + 1 <= StringLen($sData) Then
                            $iStart = $iIndex + 1
                            $iStr = 2
                        EndIf
                    EndIf
            EndSwitch
        Next
        If $iStr <> 0 Then Return SetError(1, 0, '')
        Return $sRet
    EndFunc
    Alles anzeigen

    Die "test.txt"-Datei enthält Deine obige Vorgabe ("fiktive Programmzeile").

  • markierte Dateien mit der Maus bewegen ?

    • Oscar
    • 15. Mai 2020 um 20:12
    Zitat von mm4040

    Also Gut das Programm heißt Tiny Pic und man kann ganz einfach Jpg Bilder in das Fenster von tiny Pic ziehen - dann werden sie gleich komprimiert.

    Genau DAS ist mit dem XY-Problem gemeint.

    Wozu überhaupt "Tiny Pic" verwenden, wenn man das Ganze mit AutoIt erledigen kann?

    Was genau verstehst Du denn unter "komprimiert"?

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™