| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Database.SaveAs - Es wurde versucht im geschützten speicher zu lesen (2565 mal gelesen)
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Jun. 2010 14:20 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich habe ein Problem mit der Funktion: Document.Database.SaveAs(Name,Saveversion) In meinem Programm laufe ich eine Liste von Zeichnungen nacheinander durch und öffne diese. Damit es einfacher wird, speicher ich die Zeichnung(Database) gleich wieder unter einem neuen Namen, und schließe die Zeichnung. Bei der zweiten Zeichnung bekomme ich jedoch nach dem Öffnen den Fehler: Es wurde versucht im geschützten speicher zu lesen Die Zeichnung ist dann aber offen in Autocad. Hier die Definition des Autocad Befehls:
Code:
<Autodesk.AutoCAD.Runtime.CommandMethod("MyTool", CommandFlags.Transparent)> _ Public Sub MyTool() Dim frmTool As New frmMyTool() frmTool.Show() End Sub
Transparent, damit jede neue geöffnete Datei aktiv gesetzt wird.Hier die Schleife
Code:
For Each myFile As String In Files Try Try ApplicationServices.Application.DocumentManager.Open(myFile, False, "") Catch ex As Exception MsgBox(ex.Message & vbNewLine & ex.StackTrace) End Try ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.SaveAs(NewFileName, DwgVersion.AC1024) ApplicationServices.Application.DocumentManager.MdiActiveDocument.CloseAndDiscard() ' acaddoc = ApplicationServices.Application.DocumentManager.MdiActiveDocument 'acaddoc.Database.SaveAs(NewFileName, DwgVersion.AC1024) 'acaddoc.CloseAndDiscard() 'acaddoc.Dispose() 'acaddoc = Nothing Catch ex As Exception MsgBox(ex.Message & vbNewLine & ex.StackTrace) End Try Next
Kann den Fehler jemand nachvollziehen? mfg [Diese Nachricht wurde von veydan am 08. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 08. Jun. 2010 15:03 <-- editieren / zitieren -->
Hi, sorry, nur um sicherzugehen: Du startest einen Befehl mit CommandFlags.Transparent und versuchst aus diesem heraus (halt indirekt über's Formular) ein Speichern durchzuführen? ==> Geht NICHT, die Datenbank muss schließbar sein, und das ist sie imho nicht, wenn ein transparenter Befehl aktiviert ist. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Jun. 2010 15:10 <-- editieren / zitieren --> Unities abgeben:
Hallo! Es funktionierte auch nicht mit .Session. edit: Der Fehler liegt anscheinend an den Zeichnungen selbst. Ich habe sie jetzt mal mit _recover geöffnet, und da wird 1 Fehler gefunden. Danach ist der Save befehl deaktiviert. Bei "normalen" Zeichnungen funktioniert es. [Diese Nachricht wurde von veydan am 08. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 09. Jun. 2010 11:12 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich versuche nun, die Zeichnungen mit Recover zu öffnen Hier der erste Versuch: Code:
acaddoc = ApplicationServices.Application.DocumentManager.MdiActiveDocument acaddoc.SendStringToExecute("_recover " & MyFile & " ", False, False, True)
Danach sollte er eigentlich die Zeichnung öffnen und reparieren, aber das Programm macht nichts. Ich vermute es hängt mit der Aktivität meines Befehls zusammen, der das Programm startet Kann ich dass bei den Parametern steuern die beim SendStringToExecute noch dabei sind, oder anders? Oder bin ich ganz auf dem Holzweg? mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Jun. 2010 11:30 <-- editieren / zitieren -->
Hi, tut 'nichts' würde ich nicht verstehen, es sollte schon der Befehl gestartet werden, aber dann... - wenn Du zuvor FILEDIA nicht ausgeschaltet hast, dann kommt ein Dialog und damit ist Dein weiterer Ablauf des Commands blockiert - Wenn Du zuvor FILEDIA auf 0 gestellt hast, dann gibt es noch die Brösel mit erlaubten Leerschritten in Dateinamen, also wird der Teil: ... MyFile & " " kein <ENTER> auslösen, denn es könnten ja noch Zeichen folgen, die zum Dateinamen gehören. Probier mal: "_recover " & MyFile & vbCr HTH, - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 09. Jun. 2010 12:37 <-- editieren / zitieren --> Unities abgeben:
Mir fällt gerade ein, dass der Befehl SendStringToExecute erst ausgeführt wird, nachdem der aktuelle Befehl abgearbeitet ist. Mein Programm wird aber über einen Befehl gestartet, dass heißt der SendstringToExecute würde erst nachher ausgeführt werden. Kann man das irgendwie übergehen? edit: Ich bekomme beim angeben eines Pfades incl Datei immer: Unbekannter Befehler "DWG". egal ob
Code:
acaddoc.SendStringToExecute("_recover" & vbCr & file & vbCr, True, False, False)
oder Code:
acaddoc.SendStringToExecute("_recover " & file & vbCr, True, False, False)
Die Datei liegt jetzt direkt unter "D:\File.dwg" also auch keine Leerzeichen...
[Diese Nachricht wurde von veydan am 09. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Jun. 2010 13:16 <-- editieren / zitieren -->
Hi, wenn Du einen eigenen Befehl startest, dann kannst Du darin (innerhalb des Ablaufs des eigenen Befehls) keine anderen Befehle starten (ausser welche, die als Transparent definiert sind, z.B: 'ZOOM). Grundsatz: In AutoCAD kann immer nur ein (nicht-transparenter) Befehl aktiv sein. Hilfsmittel könnte sein, Du baust eine Palette und auf dieser Palette ist ein Button, mit welchem Du eine interne Funktion startest (aber eben keinen eigenen Befehl), das könnte mit SendCommand oder acedPostCommand funken. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 09. Jun. 2010 14:47 <-- editieren / zitieren --> Unities abgeben:
ok, vl kann ich das Problem von einer anderen Seite aus angeben. Wenn ich mein Document Objekt habe und darin Dinge ändere (Blöcke etc.) mit einer Transaction. Diese dann Commit. Kann ich überprüfen ob die Datenbank noch ohne Fehler ist? Wenn ja, und sie hat Fehler, kann ich diese auch beheben lassen? mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Jun. 2010 14:53 <-- editieren / zitieren -->
Hi, dieses hätte ich im Objektkatalog gefunden, gearbeitet habe ich damit noch nicht. Public Overridable Sub Audit(ByVal auditInfo As Autodesk.AutoCAD.DatabaseServices.AuditInfo) Member von Autodesk.AutoCAD.DatabaseServices.DBObject Also sollte es möglich sein, die Elemente zu prüfen. Reparieren lassen würde ich mal nicht in der Applikation machen, denn Du weisst zu diesem Zeitpunkt ja nicht, ob ev. an der Datenbank massiv gedreht werden muss (z.B. AUDIT_LAYER, ...) um die DWG wieder ins Lot zu bekommen. In diesem Fall hätte ich einen Hinweis an den Anwender ausgegeben mit einer Anleitung der Vorgehensweise. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 09. Jun. 2010 15:30 <-- editieren / zitieren --> Unities abgeben:
Mein Problem ist definitiv die Abarbeitung mehrere Files hintereinander. Einzeln funktionieren alle Zeichnungen problemlos. Bei der Stapelkonvertierung tritt ein "Es wurde versucht im geschützten Speicher zu lesen..." Fehler auf. Aber erst bei der 2 Zeichung und dort immer bei einer bestimmten Zeile. Suche mir in einer Funktion bestimmte Blöcke und merke mir die ObjectID's In der 2 Funktion gehe ich die ObjectID's durch und möchte mir das Entity Objekt holen Code:
tDBObj = CType(tTrAct.GetObject(enumerator.Current, DatabaseServices.OpenMode.ForWrite, True, True), DatabaseServices.Entity)
hier stürzt er ab. enumerator.Current ist meine ObjectID die ich vorher gefunden habeIch benutze aber vorher schon die Transaction zum Holen des Layout BlockTableRecords, bzw des Model BlocktableRecords und der Blocktable, und da funktioniert noch alles wunderbar edit: Habe die Lösung gefunden. In meiner Konvertierungsklasse war noch eine Objectid von der letzten Zeichnung, als er dieses Objekt holen wollte, kam es natürlich zum Crash...
mfg [Diese Nachricht wurde von veydan am 09. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Jun. 2010 15:40 <-- editieren / zitieren -->
Hi, meine Erfahrung zu 'Es wurde versucht im geschützten Speicher zu lesen...' ist, dass ich einen Fehler beim Programmieren gemacht habe. Und gerade, wenn zwischendurch Documents oder Databases getauscht werden, dann muss eben alles an vorhandenen Instanzen gelöst und neu gebunden werden. In Deinem Beispiel hätte ich z.B. die TransAction als etwas gesehen, was ganz sicher nur für eine Database stabil ist. 'enumerator.Current' hätte ich zuvor mal einer Variable zugewiesen und diese Variable dann mit einem gesetzten Haltepunkt überprüft (und die Variable dann bei GetObject verwendet). Zu diesem Zeitpunkt kannst Du schon sehr viel über die ObjectID und den Zustand des Objekts sehen bevor Du es noch öffnest. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|