Zugriffsverletzung bei Dateizugriff
-
Blitzbirne-C++ schrieb:
Ich glaube wir reden da ein wenig aneinander vorbei ...
Windows hat scheinbar ein Handle auf den Prozess über das Windows weiss welcher Fehler aufgetreten ist. Sobald nun eine Zugriffsverletzung auftritt, da mehrere Prozesse gleichzeitig auf eine Datei zugreifen, gibt mir Windows dies per MessageBox bekannt.
Solch einen Mechanismus gibt es in Windows nicht!
Der entsprechende Konstruktor den Du verwendest wirft eine Exceptin die man abfangen kann! Punkt!Ich brauche also nicht expliziet eine MessageBox zu generieren.
Nur genau in dem Moment reisst es meine Applikation ins Nirvana.Kann man die Message unterdrücken?
WIe kann ich es hinkriegen, dass es nicht zu diesen Kollisionen kommen kann?Mach einen Break im Debugger und schau Dir Dein Callstack an. Die Nachricht kommt von Dir!
-
Warum so kompliziert? Erzeuge vor dem Öffnen einer Datei eine Art Lock-Datei. Diese bleibt solange bestehen, wie die Datei verwendet wird. Wenn du jetzt mit dem anderen Thread zugreifen möchtest , überprüfst du voher , ob die Datei besteht, wenn ja warten, wenn nicht kanns losgehen. Hier mal son ein Freihand code (muss nciht korrekt sein)
Öffnen
int myfopen(char * filename, char* mode) { FILE *fp; bool check; if(fopen("Lock-Datei","rb") != 0) return 0; // Lockdatei vorhanden, abbrechen; Datei nicht freigeben fopen("Lock-Datei","w+"); // Lock Datei anlegen fp=fopen(filename,mode); // Datei öffnen, ist somit gesperrt für andere return fp; } void myfclose(FILE *fp) { flclose(fp); remove("Lock-Datei"); }
-
Solch einen Mechanismus gibt es in Windows nicht!
Der entsprechende Konstruktor den Du verwendest wirft eine Exceptin die man abfangen kann! Punkt!Wie auch immer diese Exception den Weg als Messagebox auf meine Windowsoberfläche findet, so würde ich dies halt gerne unterdrücken.
Wenn ich nur wüßte wie ...Mach einen Break im Debugger und schau Dir Dein Callstack an.
Ich muß gestehen: Ich weiss nicht wirklich wie.
Erzeuge vor dem Öffnen einer Datei eine Art Lock-Datei
So in etwa habe ich es bisher versucht gehabt. Doch habe ich den Inhalt dieser Datei ausgewertet.
Habe halt in diese Datei reingeschrieben ob gesperrt oder nicht.
Das Resultat: Es kam oftmals beim Auswerten des Inhalts dieser Datei zur Zugriffsverletzung
Du öffnest sie ja gar nicht sondern überprüfst nur das Vorhandensein.
Vielleicht funktioniert es ja so besser ...Habe evtl. schon eine funktionierende Form aus den gestriegen Infos gebaut. Teste es gerade aufs Extremste ...
Lasse es euch wissen.
Martin, wäre nett wenn du mir das mit dem Unterdrücken noch näher erklären könntest, da es mir die sauberste Lösung zu sein scheint.
Kleines Codebeispiel würde mir als Noob
echt weiterhelfen.Bis hier schonmal ein Danke euch beiden ...

Ihr helft mir wirklich sehr.
-
Blitzbirne-C++ schrieb:
Solch einen Mechanismus gibt es in Windows nicht!
Der entsprechende Konstruktor den Du verwendest wirft eine Exceptin die man abfangen kann! Punkt!Wie auch immer diese Exception den Weg als Messagebox auf meine Windowsoberfläche findet, so würde ich dies halt gerne unterdrücken.
Wenn ich nur wüßte wie ...Normalerweise erscheint diese MessageBox nur, wenn die Exception ihren Weg aus der Anwendung herausgefunden hat. Wenn du den relevanten Code in ein try-catch einschließt und dort die Exception verarbeitest, bekommt Windows gar nichts davon mit.
Mach einen Break im Debugger und schau Dir Dein Callstack an.
Ich muß gestehen: Ich weiss nicht wirklich wie.
Bei uns im Magazin gibt es einen hilfreichen Artikel "Debuggen mit VC6" - den solltest du dir mal zu Gemüte führen.
-
NA meine Variante prüft doch nur die Existenz der Lock-Datei und schreibt sie nicht. Ist doch sone Art Auf Existensprüfung oder?
-
Hallo Leute,
habe mir über's schöne lange WE nochmals Gedanken gemacht und baue mir gerade ein weiteres kleines Tool um die Zugriffsroutinen zu testen.
Habe mich dafür entschieden diese ganzen Sperrdateien zu ersetzen gegen Sperrvariablen, welche aus dden verschiedenen Klassen zugängig sind.
Sollte die elegantere Variante sein. MAl schauen wie ich das realisiert kriege.Was haltet ihr davon?
Gruß
Blitzbirne
-
mhh kommt daraus an, wenn das Prog alleine läuft müsste es gehen. Es kommen aber schon die Probleme wenn das Programm mehrfacha ufgerufen wird.
-
Wenn du "Sperrvariablen" verwenden willst musst du den Zugriff auf diese aber synchronisieren. Und wenn du "Sperrvariablen" verwendest brauchst du auch gleich keine Datei mehr, dann kannst du nämlich auch gleich über nen gemeinsam genutzten Speicherbereich kommunizieren.
p.S.: ansonsten: mach die datei "share-deny-none" auf, und verwende LockFile().
p.p.S.: zu der Fehlermeldung: diese KANN nicht angezeigt werden, es sei denn du hast irgendwo Code (selbst geschrieben oder übernommen) der sie anzeigt, oder die Exception wird von dir nicht gefangen (dann zeigt das Framework (MFC) die Fehlermeldung an).