Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Database.SaveAs - Es wurde versucht im geschützten speicher zu lesen

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:  Database.SaveAs - Es wurde versucht im geschützten speicher zu lesen (2565 mal gelesen)
veydan
Mitglied



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 08. Jun. 2010 14: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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 08. Jun. 2010 15:10    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

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 09. Jun. 2010 11:12    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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 09. Jun. 2010 12:37    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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 09. Jun. 2010 14:47    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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 09. Jun. 2010 15:30    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

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 habe

Ich 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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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 >>)

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