Aktueller Pfad ist falsch
-
Hallo,
über folgende Codezeilen lasse ich mein Prog den Aktuellen Pfad bestimmen, damit es hier ein INI File öffnet.// Get Current Direcctory char *direkt = new char[500]; int laenge = GetCurrentDirectory(499,direkt); direkt[laenge] = NULL; direktory.Format("%s",direkt);Solange ich das Prog direkt mit der .exe in seinem Verzeichnis starte, läuft alles Reibungslos. Starte ich nun das Prog aus einem Access Formular heraus(die DB befindet sich im selben Verzeichnis wie die Prog .exe, dann kann mein INI FIle nicht gelesen werden, da der Aktuelle Pfad nun plötzlich auf 'MyDocuments' verweist. Woran liegt das und wie kann ich das reparieren?
Teddy
-
In den FAQ gibt's einen Beitrag zum Thema Programmpfad erhalten.
MfG
Happosai
-
Der Beitrag in der FAQ hilft da auch nicht viel weiter, da ich ja wie gesagt keine Probleme habe, den Pfad zu bekommen. Nur wenn ich das Prog SecondHand starte, dann erhalte ich falsche Pfadangaben.
Außerdem erhält man durch den Code der FAQ:
char buf[256]; GetModuleFileName(NULL, buf, 255); CString strPfad; direktory.Format("%s", buf); int nTmp = direktory.Find('\\'); direktory.Delete(nTmp,strPfad.GetLength()-nTmp);die komplette CommandLine incl. des Prog-Namens. Diesen brauch ich aber nicht und er lässt sich auch nicht so einfach entfernen. Dies würde, zb. ein verschieben der Verzeichnisse nicht Standhalten und ich will nicht jedesmal, wenn ich es auf einem anderen Rechner installier, den Code ändern.
Das ersetzen der letzen Code-Zeile durch:
direktory = direktory.Mid(1, nTmp);zum Abtrennen des Prog-Namens führt dazu, dass auch der Laufwerksbuchstabe aus dem CString verschwindet mit dem Erfolg, dass die INI-Files weiterhin nicht gefunden werden.
[ Dieser Beitrag wurde am 30.04.2003 um 15:47 Uhr von Teddy editiert. ]
[ Dieser Beitrag wurde am 30.04.2003 um 16:02 Uhr von Teddy editiert. ]
-
Also wenn Du mit dem Code der FAQ 'GetModuleFileName' die komplette Kommandozeile erhälst, dann empfehle ich Dir, Dein Betriebssystem wegzuschmeissen, da dieser Effekt sicherlich bei noch niemandem aufgetreten ist!
-
CString temp(GetCommandLine()); MessageBox(temp,temp,NULL); // Nur mit CString als möglichkeit int foundat = 0; int lastFoundAt = 0; do { foundat = temp.Find('\\',foundat); if(foundat == -1) break; lastFoundAt = foundat++; } while(foundat != -1); if(lastFoundAt != 0) temp.Delete(lastFoundAt,temp.GetLength()-lastFoundAt); // Ergebnis ausgeben MessageBox(temp,temp,NULL); // Möglichkeit mit hilfe des std::string std::string help(static_cast<LPCSTR>(GetCommandLine())); CString temp2; std::string::size_type pos = 0; pos = help.find_last_of('\\'); if(pos != std::string::npos) temp2.Format("%s",help.substr(0,pos).c_str()); MessageBox(temp2,temp2,NULL);
-
ich geb dir noch einen tipp: nehm in deinem programm als bezeichner keine mischbegriffe aus deutsch und englisch wie direktory.bei einem größeren projekt mit vielen Bezeichnern kommst du da ganz schnell total durcheinander, vor allem wenn andere Leute deinen Code auch noch verstehen wollen.
-
@Knuddelbaer
1. Für Deine 1. Methode gibts die Funktion CString::ReverseFind!
2. Deine Methode ist nicht einsetzbar, wenn das Programm als Parameter einen Pfad erwartet!
-
@Rene
Irgendwie hab ich das schon vermisst, nur nicht gefunden O
Aaaaaber da steht es ja nun 
Zu 2. Irgendwie ignoriert das es sich um GetModuleFileName handelt. Hab so viel Commandline gelesen in letzter Zeit... Habs da gedanklich eingebaut. Und da steht nu ma der Programmpfad mit Name der Anwendung drinne O
