Problem mit GetOpenFileName()
-
Hi,
Wie geschrieben habe ich ein (indirektes) Problem mit der Funktion GetOpenFilename bzw der OPENFILENAME Struktur.Ich benutze eine Klasse die beim Erzeugen den User auffordert eine Datei auszuwählen, Code sieht so aus:
/* Konstruktor der Klasse 'KalenderData' */ KalenderData::KalenderData() { GetFilePath(); };
GetFilePath sieht so aus:
bool KalenderData::GetFilePath() { OPENFILENAME ofn; // common dialog box structure char szFile[255]; // buffer for file name // Initialize OPENFILENAME ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = NULL; ofn.lpstrFile = szFile; // // Set lpstrFile[0] to '\0' so that GetOpenFileName does not // use the contents of szFile to initialize itself. // ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "Skd Files\0*.skd\0"; ofn.nFilterIndex = 0; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = "C:\\"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; // Display the Open dialog box. if(GetOpenFileName(&ofn) != 0) { /* SKD Filename ist ein std::string der Klasse selber */ SKDFilename = szFile; return true; } else return false; }
so weit so gut,klappt alles wunderbar.
gleichzeitig verwende ich auch noch eine LogFile Klasse, die eine Datei öffnet,nen Logeintrag hinterlässt und wieder schließt.Angenommen beim Start des Programms speichert die LogFile Klasse noch in denselben ordner wie die .exe (da ich bei fstream nur "LogFile.log" und keinen ganzen Pfad benutzen möchte). Nachdem ich aber mit GetOpenFileName eine *.skd Datei ausgewählt hab,die auf dem Desktop liegt, speichert die LogFile Klasse den LogEintrag auch auf dem Desktop.
Ich vermute mal es liegt daran, dass Windows annimmt der Ort für die .exe sei jetzt der Desktop, ich weiß aber nicht wie man sowas umgehen könnte.
Ich hoffe ihr habt mein Problem verstanden, vllt weiß einer von euch ja weiter
MfG
Bl1nk182
-
Du begehst den Fehler nicht zu berücksichtigen das Dein Programm ein Current Working directory hat.
Durch GetOpenFileName wird dieses Current Working Directory geändert.
Du solltest grundsätzlich Pfadangaben komplett angeben.
Es ist ein Irrtum zu glauben, dass wenn Du eine Datei ohne Pfadangabe öffnest, das dann der EXE Pfad genommen wird. Das Current Working Directory kann derjenige, der Deinen Prozess startet selbst bestimmen. (Siehe auch Verknüpfungsinfos im Exlorer, oder Argumente bei CreateProcess).
-
ok,verstanden
gibt es denn eine möglichkeit den pfad des Current Working Directory abzuspeichern,vllt irgendeine Funktion?
Bevor das Programm nämlich noch nicht fertig ist und ich kein richtiges Program Directory habe, möchte ich erstmal mit den mitteln arbeiten
wenns natürlich gar nich gehen sollte, muss ich wohl umsteigenMfG
Bl1nk182
-
Arbeite mit kompletten Dateipfaden!
Das ist das Beste. Das aktuelle Programmverzeichnis in dem Deine EXE liegt erhälst Du mit GetModuleFileName!
-
Alternativ könnte man auch vor dem Aufruf von GetOpenFileName das aktuelle Verzeichnis über GetCurrentDirectory ermitteln und anschließend wieder setzen.