Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  ActiveX: Layer-Erzeugung erzeugt Access Violation

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  ActiveX: Layer-Erzeugung erzeugt Access Violation (2199 mal gelesen)
Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 28. Jun. 2004 11:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Tag zusammen.

Da es mich nunmehr eine knappe Woche meiner Zeit gekostet hat, einen äußerst unangenehmen Crash (Acces Violation 0xC00...05) auf seine tatsächliche Ursache zurück zu führen, will ich meine Erkenntnisse auch öffentlich machen.

Der Crash wird aller Wahrscheinlichkeit nach durch einen Fehler beim Auführen der Add-Methode am Layers-Container bei anschließender "Berufung" zum aktuellen Layer erzeugt. Ich vermute, dass die Layer-Tabelle oder der zugehörige Datenbank-Bereich an sich nicht Ordnungs gemäß geschlossen wird und damit die Zeichnung in eine "instabilen" Zustand versetzt wird. Der Fehler tritt zu Tage, wenn Geometrie (z.B. via entmake) erzeugt wird und durch implizite Layer-Zuweisung (keinen GruppenCode 8 angeben) die Verwendung des aktuellen Layers erzwungen wird.

Unten ein kleiners Beispiel, das voraussetzt, das es in der Zeichnung keinen Layer LayerCrashDemo gibt - das sollte ohne Schwierigkeiten einzurichten sein:
____________________________________________________________________

Code:

(defun c:layerCrashBug ( / )
;|ACHTUNG: Die Anwendung dieser Demo kann eine AutoCAD-Zeichnung nachhaltig beschädigen. Die Verwendung geschieht auf eigene Gefahr und unter dem Wissen, dass keine Schadenersatz-Ansprüche gg. den Autor durch Verwendung dieses Demonstrations-Programms entstehen.
|;
  (vl-load-com)
  ((lambda(thisDrawing)
    (vlax-put-property
      thisDrawing'ActiveLayer
      (vlax-invoke-method
        (vlax-get-property thisDrawing'Layers)
        'Add
        "LayerCrashDemo"
      )
    )
    ;****    Work-around - Remove comment at next line of code ****
    ;****    to prevent the little demo-program to crash.      ****
    ;(command"_.-layer""")
    (entmake
      '((0 . "LINE")
        (10 0 0 0)
        (11 1 1 0)
      )
    )
  )
  (vlax-get-property(vlax-Get-Acad-object)'ActiveDocument)
  )
)


____________________________________________________________________


Nun habe ich bereits einen Workaround gefunden, der ist allerdings wenig elegant (das sind Workarounds allerdings i.d.R. nicht). Mich würde nun schwer interessieren, ob's hier jemanden gibt, der/die zu diesem Verhalten fundierte Hindergründe kennt (DEV-Help schweigt bisher beharrlich, aber das kann vielleicht noch werden) und damit das Problem bereits an der Wurzel packen kann. Alternativ bleibt nur die Abkehr von den ActiveX-Wrappern, um Programme stabiler zu machen.

Achim Dabrunz

ACHTUNG: Die Anwendung dieser Demo kann eine AutoCAD-Zeichnung nachhaltig beschädigen. Die Verwendung geschieht auf eigene Gefahr und unter dem Wissen, dass keine Schadenersatz-Ansprüche gg. den Autor durch Verwendung dieses Demonstrations-Programms entstehen.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADwiesel
Moderator
CAD4FM UG




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 28. Jun. 2004 12:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dabrunz 10 Unities + Antwort hilfreich

Hai, Achim

ich konnte natürlich nicht drumrum deine Erkenntnisse mal auszuprobieren.
das Ergebnis war 'leider' ernüchternd.
auf Acad 2002 konnte ich den Fehler in keinster Weise reproduzieren.

evtl liegt der Hund woanders begraben?

------------------
Gruß
CADwiesel
Besucht uns im CHAT

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 28. Jun. 2004 13:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Das stimmt. Ich habe vergessen anzumerken, dass der Fehler erst ab 2004 auftritt. Das ist auch genau mein Problem, denn die Funktionalität zur Layer-Erzeugung und -Bearbeitung ist in einen LIB-Modul vergraben, dass seit Jahren keine Änderungen mehr erfahren hat. Der Fehler tritt allerdings reproduzierbar ab ACAD 2004 auf.

Achim Dabrunz

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 28. Jun. 2004 13:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von Dabrunz:
Nun habe ich bereits einen Workaround gefunden, der ist allerdings wenig elegant (das sind Workarounds allerdings i.d.R. nicht). Mich würde nun schwer interessieren, ob's hier jemanden gibt, der/die zu diesem Verhalten fundierte Hindergründe kennt

Hallo Achim,

im Gegensatz zu CADwiesel kann ich den Fehler unter AutoCAD 2002 unmittelbar nachvollziehen. Eine Erklärung dafür habe ich zwar auch nicht, aber auf eine ganze Reihe ähnlich seltsamer Bugs der COM Schnittstelle bin ich auch schon gestossen.

So löst beispielsweise die Einrichtung eines Reaktors bei S::STARTUP manchmal (unter identischen Randbedingungen durchaus nicht immer) einen Totalabsturz aus. Hier vermute ich Timing-Probleme von AutoCAD bei der Initialisierung einer Zeichnung - S::STARTUP scheint nicht die volle Initialisierung abzuwarten. Ein belangloser Aufruf eines Commands vor dem VL-LOAD-COM ist hier der Workaround - der Command scheint die Initialisierung abzuwarten.

Noch seltsamer ist, dass bei einem Editor-Reaktor manche AutoCAD-Befehle, die den Reaktor auslösen sollen, nur dann sauber funktionieren, wenn sie in der Reaktorfunktion explizit genannt werden. Wenn Du beispielsweise in der Reaktorfunktion auf unterschiedliche Befehle unterschiedlich reagieren willst, genügt das nicht:

(cond
  ((= calling-cmnd "LINE") ...)
  ((= calling-cmnd "CIRCLE") ...)
  ('for-all-other-commands      ;Tribut an Axel :-)
    ...
  )
)

Einige der global angesprochenen Funktionen werden so manchmal (auch wieder nicht immer nachvollziehbar) mit einer Exception crashen. Dass NEW und OPEN Seiteneffekte haben können, die hier nicht sauber programmiert wurden, ist ja noch nachvollziehbar. Aber dass das auch für den Befehl DIST gilt, ist schon recht abenteuerlich. So gibt's keinen Absturz:

cond
  ((= calling-cmnd "LINE") ...)
  ((= calling-cmnd "CIRCLE") ...)
  ((member calling-cmnd  '("NEW" "OPEN" "DIST")) (prin1))
  ('for-all-other-commands      ;Tribut an Axel :-)
    ...
  )
)

Bei dieser Angelegenheit gibt's auch noch ein weiteres Mysterium: es gibt auch unerklärliche Abstürze, wenn die Reaktorfunktion bei diesen Befehlen NIL zurück gibt, also etwa das:

((member calling-cmnd  '("NEW" "OPEN" "DIST")) nil)

Ich hab's aufgegeben, für diese Sachen nach Erklärungen zu suchen. Autodesk hat VisualLISP als "work in progress" übernommen, hat es aber niemals wirklich über den letzten Stand von VitalLISP hinaus weiter entwickelt. Gerüchten zufolge soll der Code von VitalLISP ziemlich undurchschaubar gewesen sein, der russische Programmierer (wie hiess er gleich noch) hat da weitgehend auf russisch programmiert, er durfte bei der Umschreibung auf VisualLISP nicht mit helfen. Autodesk hat einige Funktionsnamen geändert, und das war's dann auch schon bis heute ...

Ich will gar nicht daran denken, was für ein leistungsfähiges Werkzeug uns dadurch verloren ging, dass Autodesk VitalLISP übernommen hat :-( Für eine dann leider nicht mehr gekommene nächste Version von VitalLISP waren beispielsweise u.a. auch in LISP programmierbare ARX-Objekte angekündigt worden ...

Das Motiv von Autodesk für die Übernahme von VitalLISP war keineswegs der Wunsch, den AutoCAD Anwendern ein leistungsfähiges Werkzeug anbieten zu können. Vielmehr "drohte" damals Bentley schon damit, VitalLISP in Microstation einzubauen. Und wenn dann noch eine VitalLISP Version für IntelliCAD gekommen wäre, dann hätten wir Entwickler uns doch schon fast in Programmer's Paradise gewähnt :-)

Und um meinen Beitrag konstruktiv zu beschliessen: eine einheitliche Entwicklungsumgebung (natürlich mit Sourcecode-Kompatibiltät) für die gängigsten programmierbaren CAD Systeme steht immer noch aus und würde sicherlich einen sehr aufnahmebereiten Markt finden. Wer macht mit?

Gruß
Tom Berger

------------------


fuchsi
Mitglied
Programmierer c#.net Datawarehouse


Sehen Sie sich das Profil von fuchsi an!   Senden Sie eine Private Message an fuchsi  Schreiben Sie einen Gästebucheintrag für fuchsi

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 28. Jun. 2004 13:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dabrunz 10 Unities + Antwort hilfreich

ich bin mal auf sowas ähliches gestossen
die gleichzeitige verwendung von activeX (vla-put usw.) mit herkömmlicher technologie (entmake (entmod fürte bei mir häufig zu abstürzen ala eLockViolation

probier mal da ein simples (command "._redraw") zwischen den Technologien
siehe dazu meinen Thread http://ww3.cad.de/foren/ubb/Forum145/HTML/000313.shtml

habs mal dein beispiel ausprobiert
acad 2000i kein absturz
acad 2004  absturz

nach meiner Änderung KEIN absturz in beiden versionen
aber irgendwie versteh ich dein beispiel mit lambda nicht, wieso beginnt denn die zeile mit 2x (
(( lambda .....


(defun c:lc( / )
;|ACHTUNG: Die Anwendung dieser Demo kann eine AutoCAD-Zeichnung nachhaltig beschädigen. Die Verwendung geschieht auf eigene Gefahr und unter dem Wissen, dass keine Schadenersatz-Ansprüche gg. den Autor durch Verwendung dieses Demonstrations-Programms entstehen.
|;
  (vl-load-com)
  ((lambda(thisDrawing)
    (vlax-put-property
      thisDrawing'ActiveLayer
      (vlax-invoke-method
        (vlax-get-property thisDrawing'Layers)
        'Add
        "LayerCrashDemo"
      )
    )
    ;****    Work-around - Remove comment at next line of code ****
    ;****    to prevent the little demo-program to crash.      ****
    ;(command"_.-layer""")
    (command "._redraw")
    (entmake
      '((0 . "LINE")
        (10 0 0 0)
        (11 1 1 0)
      )
    )
  )
  (vlax-get-property(vlax-Get-Acad-object)'ActiveDocument)
  )
)

------------------

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 28. Jun. 2004 14:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von fuchsi:
probier mal da ein simples (command "._redraw") zwischen den Technologien
[/B]

Auch das deutet auf ein Problem mit dem Timing bzw mit unvollständiger Initialisierung hin.

Zitat:

aber irgendwie versteh ich dein beispiel mit lambda nicht, wieso beginnt denn die zeile mit 2x (
(( lambda .....

Das ist LISP :-) Das erste Element dieser Liste ist eine ganz normale Funktion. Statt der anonmyen Funktion LAMBDA hätte Achim ja eine statische Funktion mittels (defun fun ...) definieren können, und dann stände als erstes Element oben halt einfach so: (fun ....) statt so: ((lambda ...) ...).

LISP Ausdrücke werden ja immer von Innen nach Aussen evaluiert, so dass hier (lambda () ....) zu einer Funktion evaluiert, die genau so verwendet werden kann wie fun. Ein extrem einfaches Beispiel dafür wäre z.B. ((eval '+) 2 3)

Alles klar?

Tom Berger

------------------


fuchsi
Mitglied
Programmierer c#.net Datawarehouse


Sehen Sie sich das Profil von fuchsi an!   Senden Sie eine Private Message an fuchsi  Schreiben Sie einen Gästebucheintrag für fuchsi

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 28. Jun. 2004 14:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dabrunz 10 Unities + Antwort hilfreich

so jetzt hab ich dein lambda - konstrukt verstanden

z.B.:
((lambda (a1 a2) (print a1)(print a2))
  "HALLO"
  5
)

so habs ich eigentlich noch nie verwendet, da ich hier eher eine funktion schreibe , und aufrufe.
lambda verwende ich eigentlich nur in verbindung mit mapcar

drum ist mir das momentan etwas komisch vorgekommen

------------------

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 28. Jun. 2004 15:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

______________________ etwas abseitig ______________________

Tja, wenn ich mal von den Sonder-Formen "c:bla-bla" absehe, ist lambda eigendlich genau das, was ich brauche, um Funktionen zu schreiben, denn lambda hat schließlich eine Funktion als Rückgabewert. Eher akademisch ist dann eher die Frage, ob die Verwendung von

Code:
(defun la-li-lu (x y)(.. )
oder
Code:
(setq la-li-lu (lambda (x y)(.. ))
vorzuziehen ist. Für Funktionen, die keinen Namen brauchen, ist mir aber das setq zu schade.

___________________ etwas abseitig zu Ende ___________________

Interessant ist aber, dass offenbar ACAD 2002 nur manchmal betroffen zu sein scheint. Unter 2004 und 2005 bin ich noch nie ohne Crash ausgekommen. Würde mich nun interessieren, ob das bei jemanden ohne Absturz unter einer der beiden Versionen durchläuft.

Auch die Verwendung von

Code:
(command"_.redraw")
ist eine gute Idee. Ist ja auch erheblich flotter als eine Regeneration der Zeichnung, kann aber immer noch recht lange dauern oder? Das war auf jeden Fall meine Motivation mit dem
Code:
(command"_.-layer""")
zu arbeiten. Der Aufruf ist auch (wenn ich ehrlich bin rein spekulativ) dichter an der Wurzel des Problems. redraw scheint mir allerdings wegen seiner Universalität recht interessant. Allerdings wird mit command-redraw ein interessanten Fänomen ausgelöst, von dem auch regen betroffen ist:

Die Aufrufe über command erzeugen eine nicht geschlossenen Undo-Gruppe!! Das ist natürlich Mist ...

Wird der Aufruf aber durch

Code:
(redraw)
ersetzt, verschwindet das Problem wie von Geisterhand. Wie wir sehen, ist also auch dem freundlichen command nicht uneingeschränkt zu trauen ..

Zitat:
Tom Berger schrieb:

Ich hab's aufgegeben, für diese Sachen nach Erklärungen zu suchen. Autodesk hat VisualLISP als "work in progress" übernommen, hat es aber niemals wirklich über den letzten Stand von VitalLISP hinaus weiter entwickelt.


Ernüchternd, aber innerlich bin ich wohl auch bereits an diesem Punkt der Erkenntnis angelangt. Reaktoren verwende ich ausschließlich, zum Erzeugen von Log-Files oder ähnlichem, also Operationen außerhalb von AutoCAD und eigendlich auch nur die Editor-Reaktoren, denn die zeigten sich bisher hinreichend gutmütig für den Einsatz in Produkten, die wir verkaufen. Wer will schon für Amok laufenden Reaktoren in Regress genommen werde? Ich jedenfalls nicht.

Achim Dabrunz

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 30. Jun. 2004 15:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

So, noch eine kleine Ergänzung:

Das Problem ist mittlerweile als sog. Change Request bei Autodesk eingeloggt und registriert, einher gehend mit der Bestätigung, dass es sich um einen APIProgrammier- und Anwendungsschnittstelle (Application Programming Interface)-Bug handelt. Wesendliche Ursache in diesem Zusammenhang scheint eher das Setzen der ActiveLayer-Eigenschaft des Zeichnungs-Objekts. Hier muss offensichtlich ein Update der Zeichnungs-Datenbank erzwungen werden. Neben dem (redraw) (danke fuchsi) klappt's aber auch hiermit:

Code:

(vlax-invoke-method (vlax-Get-Acad-object)'update)

Hier wird dann tatsächlich einen Konsolidierung der Zeichnungs-Datenbank erzwungen und damit das Problem an der Wurzel umgangen (nebenher ist's auch noch flott ..). Scheint mir der solideste Workaround zu sein, weil in den anderen von uns gefundenen Fällen genau dieser Aufruf implizit erfolgt, also mehr getan wird als nötig.

Autodesk hat noch drei ähnlich gelagerte Problemkreise benannt, die aber seit ACAD 2004 behoben sind:


  1. ENTMAKE AFTER ACTIVEX CALLS CAUSE INTERNAL ERROR ELOCKVIOLATION

  2. (SETVAR "SYSVAR" VALUE) FAILS WITH "CLAYER", "CELTYPE" VARIABLES

  3. SECOND SETVAR CLAYER FAILS WITHIN VLA-STARTUNDOMARK AND COMMAND "XLINE" SEQUENCE


Achim Dabrunz

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 30. Jun. 2004 15:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Zitat:
Original erstellt von Dabrunz:
[B]So, noch eine kleine Ergänzung:
(vlax-invoke-method (vlax-Get-Acad-object)'update)

Danke. Ich werde mir das mal auch überall dort einsetzen, wo ich bei AutoCAD Timing- und Initialisierungsprobleme vermutete. Nennen wir diese Probleme also zukünftig korrekter "Konsolidierungsprobleme" :-)

Gruß
Tom Berger

------------------


CADwiesel
Moderator
CAD4FM UG




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 30. Jun. 2004 16:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dabrunz 10 Unities + Antwort hilfreich

Vielen Dank Achim - Prima Recherche!
Werde ich ab sofort beachten

existieren für die anderen 3 Fehler auch schon Prä-2005 Lösungen?

------------------
Gruß
CADwiesel
Besucht uns im CHAT

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz