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

Beiträge von BugFix

  • Hilfestellung bei DllCall der zint.dll

    • BugFix
    • 21. Juni 2022 um 13:51
    Zitat von Schnuffel

    ch werde testen und melden

    Hier mal ein Muster zum Befüllen der ersten Struct, wobei ich mir nicht genau sicher bin, wofür fsize und width stehen.

    AutoIt
    ; TEST-Struct
    Global $sText = "Das ist ein Test!"
    Global $tText = DllStructCreate('char text[' & StringLen($sText) & ']')
    $tText.text = $sText
    Global $tZINT_RENDER_STRING = DllStructCreate($tagZINT_RENDER_STRING)
    $tZINT_RENDER_STRING.x = 100
    $tZINT_RENDER_STRING.y = 50
    $tZINT_RENDER_STRING.fsize = 200
    $tZINT_RENDER_STRING.length = StringLen($sText)
    $tZINT_RENDER_STRING.text = DllStructGetPtr($tText)
  • Hilfestellung bei DllCall der zint.dll

    • BugFix
    • 21. Juni 2022 um 13:10
    Zitat von Schnuffel

    Im pdf Manual ab Seite 31 wird die Nutzung der API erläutzert.

    Das Manual ist sowas von inkomplett. Keine Angaben zu den verwendeten Strukturen.

    Ich habe mal gesucht, du brauchst die zint.h - findest du hier: https://github.com/samlown/zint/blob/master/backend/zint.h

    Damit solltest du anfangen können.

    Wenn du jetzt ein konkretes Bsp. hast, das du umsetzen möchtest, helfe ich gern.

    EDIT: Ich habe mal die Struct-Definitionen zu AutoIt übertragen. Ob es zu 100% passt, wird sich erst bei der Anwendung zeigen. ;)

    AutoIt
     Global $tagZINT_RENDER_LINE = "struct;float x;float y;float length;float width;endstruct;"
    ;~     float x, y, length, width;
    ;~     struct zint_render_line *next;      /* Pointer to next line */
    
    Global $tagZINT_RENDER_STRING = "struct;float x;float y;float fsize;float width;int length;ptr text;endstruct;"
    ;~     float x, y, fsize;
    ;~     float width;                        /* Suggested string width, may be 0 if none recommended */
    ;~     int length;
    ;~     unsigned char *text;
    ;~     struct zint_render_string *next;    /* Pointer to next character */
    
    Global $tagZINT_RENDER_RING = "struct;float x;float y;float radius;float line_width;endstruct;"
    ;~     float x, y, radius, line_width;
    ;~     struct zint_render_ring *next;      /* Pointer to next ring */
    
    Global $tagZINT_RENDER_HEXAGON = "struct;float x;float y;endstruct;"
    ;~     float x, y;
    ;~     struct zint_render_hexagon *next;   /* Pointer to next hexagon */
    
    Global $tagZINT_RENDER = "struct;float width;float height;ptr lines;ptr strings;ptr rings;ptr hexagons;endstruct"
    ;~     float width, height;
    ;~     struct zint_render_line *lines;         /* Pointer to first line */
    ;~     struct zint_render_string *strings;    /* Pointer to first string */
    ;~     struct zint_render_ring *rings;         /* Pointer to first ring */
    ;~     struct zint_render_hexagon *hexagons;   /* Pointer to first hexagon */
    
    Global $tagZINT_SYMBOL = "struct;int symbology;int height;int whitespace_width;int border_width;int output_options;" & _
                             "char fgcolour[10];char bgcolour[10];char outfile[256];float scale;int option_1;int option_2;" & _
                             "int option_3;int show_hrt;int input_mode;char text[128];int rows;int width;char primary[128];" & _
                             "char encoded_data[178][143];int row_height[178];char errtxt[100];ptr bitmap;int bitmap_width;" & _
                             "int bitmap_height;ptr rendered;endstruct;"
    ;~     int symbology;
    ;~     int height;
    ;~     int whitespace_width;
    ;~     int border_width;
    ;~     int output_options;
    ;~     char fgcolour[10];
    ;~     char bgcolour[10];
    ;~     char outfile[256];
    ;~     float scale;
    ;~     int option_1;
    ;~     int option_2;
    ;~     int option_3;
    ;~     int show_hrt;
    ;~     int input_mode;
    ;~     unsigned char text[128];
    ;~     int rows;
    ;~     int width;
    ;~     char primary[128];
    ;~     unsigned char encoded_data[178][143];
    ;~     int row_height[178]; /* Largest symbol is 177x177 QR Code */
    ;~     char errtxt[100];
    ;~     char *bitmap;
    ;~     int bitmap_width;
    ;~     int bitmap_height;
    ;~     struct zint_render *rendered;
    Alles anzeigen
  • Zugriff auf COM Methode

    • BugFix
    • 21. Juni 2022 um 12:40
    Zitat von uuchip

    Die Methode GetData braucht das Objekt §display, was augenscheinlich nicht richtig übergeben wird? Bzw. Autoit kennt diesen Mechanismus so gar nicht?

    Wenn du (wie für .CoordXYZ() ) die Basic Header hast, poste unbedingt diese. Das ist AutoIt am nächsten.

    Und nochmals:

    Poste allen Code IMMER IN CODE-Markierung. Python-Code funktioniert NUR mit Einrückungen und diese verschwinden, wenn du das als reinen Text postest.

  • Outlook Mail mit eingebetteten Bildern im Body Text als versteckte Anhänge

    • BugFix
    • 21. Juni 2022 um 10:38

    Ich verwende zwar kein OL, aber meine Gedanken zur UDF-Gestaltung:

    Zitat von water

    Die Idee ist nun, über eine Funktion Optionen für die UDF zu setzen. Dies würde Script Breaking Changes vermeiden.

    Ist sicher der effektivste Weg.

    Zitat von water

    Wenn es bloss so einfach wäre.

    Mit _OL_AttachmentAdd kann man ja mehr als eine Datei anhängen. Welches Objekt soll in diesem Fall zurückgegeben werden? Des ersten Attachments, des letzten? Oder ein Array mit allen Attachment-Parametern und dem jeweiligen Objekt dazu?

    Könnte man vielleicht so handhaben (Variablen etc. frei erfunden, nur zur Verdeutlichung des Prinzips)

    AutoIt
    Global Const $OL_RET_OBJSELF = 0x1
    Global Const $OL_RET_ATTACHARRAY = 0x2
    Global Const $OL_RET_ATTACHITEM = 0x3
    
    Global $g_ReturnType = $OL_RET_OBJSELF
    Global $g_ReturnItem
    
    
    Func _OL_SetReturnOpt($_Type=$OL_RET_OBJSELF, $_Number=Null)
        $g_ReturnType = $_Type
        $g_ReturnItem = $_Number
    EndFunc
    
    Func _OL_AnyFunc($oOL, ...)
        ...
        ...
        ; ein Array $aRet wird in der Func befüllt
        ...
        Switch $g_ReturnType
            Case $OL_RET_OBJSELF
                Return $oOL
            Case $OL_RET_ATTACHARRAY 
                Return $aRet
            Case $OL_RET_ATTACHITEM 
                Return $aRet[$g_ReturnItem]
        EndSwitch
    EndFunc
    Alles anzeigen
  • Zugriff auf COM Methode

    • BugFix
    • 20. Juni 2022 um 16:13
    Zitat von Velted

    Wo ist diese Syntax (ohne DllStructGetData()) beschrieben?

    Gar nicht. :)

    Das wurde im Jahr 2014 von minx und Mars hier im Forum als funktionierend publiziert - im EN-Forum war das nicht bekannt.

    Wurde dann auch in einem Post dort bekannt.

  • Zugriff auf COM Methode

    • BugFix
    • 20. Juni 2022 um 10:39
    Zitat von uuchip

    Mir als technischer Anwender der ab und an ein Schweizer-Taschenmesser braucht reicht die Lösung,

    Ich habe trotzdem nochmal meine Funktion umgebaut anhand deiner Lösung und zusätzlich die Variante implementiert, X,Y,Z einer Messstelle als Struktur auszugeben. Ich empfinde das schon aus syntaktischen Gründen recht hilfreich, da $aResult[$i].X aussagekräftiger ist als $aResult[$i][0].

    AutoIt
    $aResult = _GetXYZCoordinates('..\File', 25, True)
    
    ConsoleWrite('Ergebnis Messstelle "25":' & @CRLF)
    ConsoleWrite($aResult[0].X & @CRLF)
    ConsoleWrite($aResult[0].Y & @CRLF)
    ConsoleWrite($aResult[0].Z & @CRLF)
    
    Func _GetXYZCoordinates($filename, $point=0, $bStructArray=False)
        Local $oPolyFile = ObjCreate('PolyFile.PolyFile')
        Local $measpoints, $measpoint                   ; Messstellen mit Daten
        Local $tagXYZ = "double X;double Y;double Z;", $tXYZ
        If IsObj($oPolyFile) Then
            $oPolyFile.Open($filename)
            $measpoints = $oPolyFile.Infos.MeasPoints
            Local $aXYZ[$measpoints.count][3]                       ; Das ist das Ergebnisarray, 1.Dim: Anzahl Messstellen, 2.Dim: Einträge X,Y,Z
            If $bStructArray Then ReDim $aXYZ[$measpoints.count]    ; jedes Item enthält die XYZ-Struktur, somit nur eine Dim erforderlich
            If $point = 0 Then
                For $i = 1 To $measpoints.count
                    Local $X = 0, $Y = 0, $Z = 0        ; zur Aufnahme der XYZ-Koordinaten EINES Messpunktes
                    $measpoint = $measpoints.Item($i)   ; liefert Objekt für eine Messstelle(i) zurück
                    $measpoint.CoordXYZ($X, $Y, $Z)     ; befüllt X,Y,Z für das Messstellenobjekt
                    If $bStructArray Then
                        $tXYZ = DllStructCreate($tagXYZ)
                        $tXYZ.X = $X
                        $tXYZ.Y = $Y
                        $tXYZ.Z = $Z
                        $aXYZ[$i-1] = $tXYZ
                    Else
                        $aXYZ[$i-1][0] = $X
                        $aXYZ[$i-1][1] = $Y
                        $aXYZ[$i-1][2] = $Z
                    EndIf
                Next
            Else
                Local $X = 0, $Y = 0, $Z = 0
                $measpoint = $measpoints.Item($point)
                $measpoint.CoordXYZ($X, $Y, $Z)
                If $bStructArray Then
                    $tXYZ = DllStructCreate($tagXYZ)
                    $tXYZ.X = $X
                    $tXYZ.Y = $Y
                    $tXYZ.Z = $Z
                    $aXYZ[0] = $tXYZ
                Else
                    $aXYZ[0][0] = $X
                    $aXYZ[0][1] = $Y
                    $aXYZ[0][2] = $Z
                EndIf
            EndIf
            $oPolyFile.Close()
            Return $aXYZ
        Else
            If $oPolyFile.IsOpen = 1 Then
                $oPolyFile.Close()
            EndIf
            Return SetError(1)
        EndIf
    EndFunc
    Alles anzeigen
  • Zugriff auf COM Methode

    • BugFix
    • 20. Juni 2022 um 09:38
    Zitat von uuchip

    $measpoint.CoordXYZ($X,$Y,$Z)

    Sehr verwunderlich, zumal in Matlab und Python die Methode ohne Parameter aufgerufen und das Ergebnis in einem Array aufgefangen wird. :/

    Aber wenn es funktioniert, ist ja OK. Kannst den Thread dann ja als "Gelöst" markieren.

    EDIT:

    Das kommt davon, wenn man versucht mit dem Smartphone im Forum "rumzuwerkeln". Dadurch hatte ich überlesen, dass du im Startpost die Beschreibung der Methode gepostet hattest. :Face:

    Somit ist es eher anders herum verwunderlich, denn die Methode erfordert 3 Parameter - wie das Matlab und Python -Skript ohne operieren können ist mir nicht ganz klar.

  • Zugriff auf COM Methode

    • BugFix
    • 20. Juni 2022 um 09:01
    Zitat von uuchip

    eine relativ einfache Phyton Umsetzung

    Nochmal die dringende Bitte: IMMER Code in Code-Markierung posten! Als Plain Text geht die Formatierung (und somit jeder Indent) verloren, was Python nahezu unleserlich macht.

    Ich habe jetzt mal geraten, wo die Einrückungen hingehören und in deinem Post editiert - bitte prüfe (und ggf. korrigiere) das.

    EDIT: Noch hilfreicher wäre, wenn es eine Objektbeschreibung gäbe (Methods /Parameter, Properties)

  • Zugriff auf COM Methode

    • BugFix
    • 20. Juni 2022 um 07:56
    Zitat von uuchip

    Phyton, Matlab, .NET Lösungen sind vorhanden,

    Poste am Besten auch die Python und .NET Lösung. Damit können wir vermutlich noch mehr anfangen.

  • Zugriff auf COM Methode

    • BugFix
    • 19. Juni 2022 um 22:44

    Ich nehme mal an, dass die Struktur als Pointer zu übergeben ist.

    AutoIt
    $tagXYZ = "double X;double Y;double Z;" 
    $tXYZ = DllStructCreate($tagXYZ)
    $pXYZ = DllStructGetPtr($tXYZ)
    ; Diesen Pointer kannst du an die Funktion übergeben
    Zitat von uuchip

    Das heist der Objekt ist da, aber kann nicht angesprochen weden. VG Lutz

    Ob das Objekt vorhanden ist würde ich mit IsObj prüfen. Ich denke da liegt ein Objektfehler vor, weil die Methode nicht als solche erkannt wird. Also bau, wie von water empfohlen, den COM-Error-Handler ein.

    P.S. Bitte nutze für Codeblöcke nicht den Inline-Code, sondern </> aus dem Menü.


    EDIT:

    Ich habe mir jetzt die Matlabfunktion mal näher angeschaut. Vorab: Von Matlab habe ich keine Ahnung. Aber ich würde das so umsetzen (eine Zeile kann ich jedoch nicht interpretieren, da ist mir unklar was in Matlab passiert - ist markiert)

    AutoIt
    Func _GetXYZCoordinates($filename, $point)
        Local $oPolyFile = ObjCreate('PolyFile.PolyFile')
        Local $measpoints, $aXYZ[3]
        If IsObj($oPolyFile) Then
            $oPolyFile.Open($filename)
            $measpoints = $oPolyFile.Infos.MeasPoints
            Local $XYZ[$measpoints.count][3]
            If $point = 0
                For $i=1 To $measpoints.count
                    $measpoint = $measpoints.Item($i)
                    $aXYZ = $measpoint.CoordXYZ()
    ;~                 XYZ(i,:) = [X,Y,Z]  ; was passiert da? Ist das syntactic sugar für: 
    ;~                                       Durchlaufe das Array XYZ in der 1.Dimension "i" für alle Einträge der 2.ten Dimension?
                Next
            Else
               $measpoint = $measpoints.Item($point)
                $aXYZ = $measpoint.CoordXYZ()
    ;~             XYZ=[X,Y,Z]  ; was passiert da?
            EndIf
            $oPolyFile.Close()
    ; --- Irgendwo hier muss dann: Return $aXYZ  erfolgen
        Else
            If $oPolyFile.IsOpen = 1 Then
                $oPolyFile.Close()
            EndIf
        EndIf
    EndFunc
    Alles anzeigen
  • Zugriff auf COM Methode

    • BugFix
    • 19. Juni 2022 um 20:43

    Hab nur kurz draufgeschaut, sollte das nicht in einer Struct landen?

    AutoIt
    $tagXYZ = "double X;double Y;double Z;" 
  • Outlook Mail mit eingebetteten Bildern im Body Text als versteckte Anhänge

    • BugFix
    • 15. Juni 2022 um 16:45
    Zitat von Concara

    In anderen Mailclients wird das Bild aber überhaupt nicht in der Email dargestellt sondern "nur" als Anhang.

    Nun, das hängt ja auch von der Einstellung des Clients ab. Ich lasse im Mail Client niemals html zu, ausschließlich Text.

    Also als erstes mal prüfen, ob nicht evtl. der Client auch auf "nur Text" eingestellt ist.

  • Ip Aktualsierung funktionieert nicht

    • BugFix
    • 15. Juni 2022 um 08:44

    Noch eine Idee:

    Versuche doch mal dein Skript an das Event-Log zu koppeln. Ist natürlich nur dann sinnvoll, wenn bei jedem deiner möglichen Fälle auch ein Logeintrag erfolgt. Dazu findest du in <Ereignisanzeige><Windows-Protokolle><System> alle relevanten Einträge. Einen betreffenden markieren, "Aktion" - "Aufgabe an dieses Ereignis anfügen..." auswählen und damit dein Skript zum IP-Check immer einmalig bei Auftreten des Ereignisses starten.

  • Ip Aktualsierung funktionieert nicht

    • BugFix
    • 14. Juni 2022 um 07:45
    Zitat von casi4712

    was dagegen, die Variable $IP beim Eintritt in die Funktion zurückzusetzen?

    Wozu? In der Adlib Funktion wird die IP mit Wert besetzt, falls der nicht gelesen werden kann mit "kein Netz". Es sind also bereits beide möglichen Zustände abgedeckt. Die Variable $IP wird immer überschrieben.

  • AdlibRegister sinnvoll einsetzen

    • BugFix
    • 13. Juni 2022 um 18:20
    Zitat von Mars

    Ich halte AdlibRegister für weitestgehend nutzlos. Eine (meiner Meinung nach) bessere Methode sind Funktionen mit Static Timer, da diese an einem Ort ausgeführt werden den "ich" festlege, während AdlibRegister Funktionen "überall" aufgerufen werden können und den Programmablauf damit durcheinanderbringen

    Dazu ein klares "JEIN" :rofl:

    Hier gilt eigentlich, wie immer, dass man wissen muss, was man tut. Ich verwende AdlibRegister recht gerne um unabhängig vom Mainloop zu sein. Die Ausführungsbedingungen werden dann durch entsprechende Variablen geregelt. Bsp.:

    Eine beliebige WM-Message Funktion wird ausgewertet. Diese muss so schnell wie möglich wieder verlassen werden aber evtl. zeitintensivere Operationen sollen damit angeschoben werden. Dazu setze ich dann eine Globale Prüfvariable, die ich in der Adlib-Funktion auswerte.

    Ist auch zum Teil Geschmackssache. Ich habe mich nie mit Timern anfreunden können und verwende diese deshalb eher selten. ;)

  • Ip Aktualsierung funktionieert nicht

    • BugFix
    • 13. Juni 2022 um 18:05

    Mal ein Tipp für den Einsatz von Adlib-Funktionen.

    Es kann immer mal passieren, dass du die Aufrufsequenz etwas zu häufig gewählt hast und die Funktion dann erneut aufgerufen wird, obwohl sie vom ersten Aufruf noch nicht fertig ist.

    Deshalb angewöhnen bei kurzen Aufrufintervallen:

    AutoIt
    Func _myAdlib()
        AdlibUnregister('myAdlib')       ; Adlibfunktion bei Eintritt in die Funktion deregistrieren
    
        ; ... was zu tun ist in der Funktion
    
        AdlibRegister('myAdlib')         ; Bei Verlassen der Funktion erneut registrieren
    EndFunc


    Systeminfos hole ich mir gerne mit Powershell:

    AutoIt
    #include <Array.au3>
    
    $aAdapter = _PS_GetActiveAdapterShortInfo()
    If IsArray($aAdapter) Then
        _ArrayDisplay($aAdapter, 'Active Network Adapters', '', 0, Default, 'Description|IPAddress|DefaultIPGateway|IPSubnet|DHCPEnabled')
    EndIf
    
    Func _PS_GetActiveAdapterShortInfo()
        Local $sCmd = 'Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | ' & _
                      'Select-Object -Property Description,IPAddress,DefaultIPGateway,IPSubnet,DHCPEnabled | ' & _
                      'foreach {$_.Description + ";" + [string]$_.IPAddress + ";" + [string]$_.DefaultIPGateway + ";" + ' & _
                      '[string]$_.IPSubnet + ";" + $_.DHCPEnabled } | out-file $env:TEMP\__ActiveAdapt.csv -Append -Encoding UTF8'
        Local $FileResult = @TempDir & '\__ActiveAdapt.csv'
        If FileExists($FileResult) Then FileDelete($FileResult)
        RunWait(@ComSpec & ' /c powershell "' & StringRegExpReplace($sCmd, '([\\"])', "\\$1") & '"', @ScriptDir, @SW_HIDE)
        Local $aRead = StringSplit(FileRead($FileResult), @CRLF, 1), $aIface, $aAdapt[$aRead[0]+1][5] = [[0]]
        For $i = 1 To $aRead[0]
            $aIface = StringRegExp($aRead[$i], '([^;]*);([^;]*);([^;]*);([^;]*);([^;]*)', 3)
            If IsArray($aIface) Then
                $aAdapt[0][0] += 1
                $aAdapt[$aAdapt[0][0]][0] = $aIface[0]
                $aAdapt[$aAdapt[0][0]][1] = $aIface[1]
                $aAdapt[$aAdapt[0][0]][2] = $aIface[2]
                $aAdapt[$aAdapt[0][0]][3] = $aIface[3]
                $aAdapt[$aAdapt[0][0]][4] = $aIface[4]
            EndIf
        Next
        ReDim $aAdapt[$aAdapt[0][0]+1][5]
        Return $aAdapt
    EndFunc
    Alles anzeigen
  • Ip Aktualsierung funktionieert nicht

    • BugFix
    • 12. Juni 2022 um 21:09
    Zitat von casi4712

    aber das Label bleibt weiterhin leer.

    Na klar, weil du die Funktion direkt davor (Zeile 85) mit Return verlässt.

  • Internet-Kommunikation - Nervige PopUp-Fenster

    • BugFix
    • 9. Juni 2022 um 10:47

    Die Impressumgestaltung wurde immer gern von der Riege der Internetverbrecher (auch Abmahnanwälte genannt) ins Visier genommen. Das hat glücklicherweise durch Änderungen in der Gesetzgebung rapide abgenommen. Wenn auch nur der Anschein der gewerblichen Nutzung bestand wurde nach jedem Haar gesucht und dann scharf geschossen.

    Aus meiner Sicht als Datenschutzverantwortlicher in unserer Firma, weist dein Impressum nur einen Mangel auf. Du bietest ein Formular für den Kundenkontakt an. Das ist eine anlassbezogene Datenverarbeitung. Darauf musst du im Impressum eingehen: was geschieht mit den Daten, wozu werden sie erfasst, wie lange bleiben sie gespeichert.

    Da ist es zwingend erforderlich einen Passus zu integrieren. Muster findest du reichlich im Netz.

  • Internet-Kommunikation - Nervige PopUp-Fenster

    • BugFix
    • 3. Juni 2022 um 11:28
    Zitat von PSblnkd

    Meine Fragestellung:

    Wie programmiert man eine Internet-Verbindung über AutoIt?

    hat leider noch niemand beantwortet ...

    Vermutlich möchte sich das niemand ans Bein binden.

    Es ist ein Ding, den Inhalt einer Web-Site auszulesen, z.B. mit InetRead. Aber ein anderer Schuh ist es Sicherheitsprotokolle zu beachten, Signaturen zu verifizieren etc. pp. - nichts was man ohne zwingende Notwendigkeit in Angriff nimmt. Einen eigenen Browser zu programmieren halte ich für eine völlig sinnfreie Idee. Allein die ständig sich entwickelnden Möglichkeiten der Browser-Engines im http und css Bereich müsstest du nachbilden und aktuell halten. Das halte ich für aussichtslos.

    Manchmal ist Einsicht in die Notwendigkeit der stressfreiere Weg. Natürlich nerven die Popups - aber: Es ist nun mal so. Also nicht aufregen und ein paar Klicks mehr akzeptieren.

  • Parameterübergabe via cmdline - Text in Variable wird in einzelne Parameter aufgeteilt

    • BugFix
    • 2. Juni 2022 um 17:08

    2 Möglichkeiten:

    • Parameter mit Leerzeichen müssen in Stringbegrenzer eingefasst werden und Zeilenumbruch kann man selbstredend NICHT übergeben!

    • $CMDLINERAW

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™