CFile schmiert ab
-
Einer meiner Dialog schmiert immer dann ab, wenn ich CFile mit
einer Variable nutzen möchte:CString droplist = GetCommandLine();// Pfad + Name der Exe holen int pos = droplist.ReverseFind( '\\'); // letztes '\' finden droplist = droplist.Mid(1, pos-1); // Name der Exe abtrennen, so dass nur noch der Pfad übrig bleibt droplist+="\\droplist.txt"; CFile file(droplist,CFile::modeCreate | CFile::modeWrite); //hier dann Absturz //Das Programm beendet sich einfach... //...NUR folgende Variante ohne Pfad-Variable funktioniert:
CFile file("c:\\test.txt",CFile::modeCreate | CFile::modeWrite); //...usw.
-
droplist = droplist.Mid(1, pos-1);
du sagtst ab "1" - das ist kaese, du musst bei 0 anfangen {o;
sonst hast du ":\test.txt" statt "C:\tet.txt"(das haettest du mit dem debugger binnen sekunden rausgefunden
theoretisch kannst du auch das machen
droplist = droplist.Left(pos) + _T("Test.txt");
-
Hast Du Dir mal im Debugger angeschaut, was nach
droplist+="\\droplist.txt";in droplist steht?
-
Man kann nicht davon ausgehen, das der Name der EXE Datei in der Befehlszeile steht.
Verwende GetModuleFileName.Zudem soltest Du mal einen Blick auf die Shell Light Weight Api werefn.
PathFindFileName http://msdn2.microsoft.com/en-us/library/ms628559.aspx
Diese Funktionen sind weitaus sicherer und besser als was man selber so mit Find/Replace/Mid macht.
-
Nein! Es funktioniert wie beschrieben

Ich hatte nur einen Fehler in CFile gemacht.
Die 1 ist schon richtig!
-
Ich wiederhole mich: Du kannst nicht davon ausgehen, dass der Name der EXE in der Commandline steht!
-
Laut MSDN muss du beim Öffnen auch noch einen Zurgiffsparameter angeben, also z.B. CFile::shareExclusive. Ich hatte da auch mal Probleme, als ich das vergessn hatte.
-
Hallo,
jetzt ist mir klar warum ihr die 1 bzw -1 nicht wollt.
Mit GetModuleFileName muss man die weglassen:char buf[256]; GetModuleFileName(NULL, buf, 255); CString droplist = buf; int pos = droplist.ReverseFind( '\\'); droplist = droplist.Mid(0, pos);
-
nimm doch einfach "GetCurrentDirectory" dann brauchst du die exe nicht aus dem namen nehmen
-
Mr Evil schrieb:
nimm doch einfach "GetCurrentDirectory" dann brauchst du die exe nicht aus dem namen nehmen
Falsch! GetCurrentDirectory kann durch den Aufrufer bestimmt werden und ist nicht identisch mit dem Programm-Verzeichnis!
-
Ok, hatte das nur zufaellig gefunden.