Problem mit "GetOpenFilename" und "fopen"
-
Hallo,
wenn ich eine Datei auswähle, die mit der Funktion "GetOpenFilename" von der WinAPI auswählbar ist, und dann OK drücke, kann ich anscheinend keine Dateien mehr schreiben mit C Funktion "fopen". Lesen geht noch aber fopen(..., "wb") (um binär zu schreiben) geht nicht mehr.Beispiel code, wie es bei mir in etwa aussieht:
std::string OpenFileRequester(std::string DefFilename, HWND ParentWnd) { static const int STR_LEN = 2048; OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); char strFile[STR_LEN] = { 0 }; memcpy(strFile, DefFilename.c_str(), DefFilename.size()); ofn.lStructSize = sizeof(ofn); ofn.lpstrFilter = "All files\0*.*\0"; ofn.lpstrFile = strFile; ofn.nMaxFile = STR_LEN; ofn.hwndOwner = ParentWnd; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; if (!GetOpenFileName(&ofn)) return ""; return std::string(ofn.lpstrFile); } bool WriteFile(std::string Filename) { FILE* pFile = 0; if ( !( pFile = fopen(Filename.c_str(), "wb") ) ) return false; /* ... */ return true; } // Wenn "OpenFileRequester" aufgerufen wird, und der User eine Datei auswählt und OK drückt, schlägt "fopen" immer fehl :-(Kann mir bitte jemand sagen, woran das liegt?
-
1. Solltest Du den "relevanten" Code posten... (ich sehe nirgends einen Aufruf von "WriteFile")
2. Du kannst auch debuggen und schauen ob in den Variablen überhaupt das richtige drin steht...
-
Jochen Kalmbach schrieb:
1. Solltest Du den "relevanten" Code posten... (ich sehe nirgends einen Aufruf von "WriteFile")
2. Du kannst auch debuggen und schauen ob in den Variablen überhaupt das richtige drin steht...@Jochen: Warum WriteFile? fopen(.., "wb") schlägt doch schon fehl. Ausserdem vermute ich, dass er danach nicht WriteFile sondern fwrite(..) verwendet.
@LukasBanane:
Wird errno gesetzt?
Warum verwendest Du nicht CreateFile / WriteFile / ReadFile?Simon
-
Schonmal was von GetLastError() gehört? Können wir dafür vielleicht mal 'nen extra Button bekommen? Damit könnten 90% der Threads im WinAPI Forum beantwortet werden.
-
@theta: ich nutze fopen, weil das unter Windows und Linux läuft. Die WinAPI natürilich nur unter Windows, aber die File-Lib habe ich in einem externen Projekt, meiner 3D Engine.
Ich vermute, dass GetOpenFileName einen Aufruf mit CreateFile oder ReadFile macht. Also dass die Datei offen ist, und dann nicht mehr mit fopen angesprochen werden kann. Aber GetOpenFileName soll doch gar nicht die Datei öffnen, sondern nur den Dateinamen liefern.
Und die C Funktionen mit fopen müssen doch genau so gut gehen?!
Was ist mit errno gemeint?EDIT:
CommDlgExtendedError() und GetLastError() geben beide FALSE zurück, also kein Fehler nach einem Aufruf von GetOpenFileName.
-
@Jochen: Sehe gerade, dass er seine eigene Funktion WriteFile genannt hat. Sorry..
@hack0r: GetLastError(..) geht doch nicht bei fopen(..)
-
@LukasBanane: Bei mir geht dein Code (fopen(..) gibt einen gültigen FILE* zurück)...
Simon
-
Mh, wenn ich den Code genau so in ein mini Programm übernheme geht's bei mir auch.
Dann muss es wohl doch irgendwo anders liegen.Vielleicht liegt's an der Art wie ich den Filter-String übernehme.
Den wandel ich nähmlich um, damit man nicht mit '\0' sondern wie in PureBaisc mit '|' arbeiten kann.Wenn ich das Problem entdeckt habe, schreib ich's hier. Danke schon mal :xmas1:
-
Fehler gefunden

GetOpenFileName ändert dunmmer Weise standardmäßig das aktuelle "WorkingDirectory". Dadurch konnte ich nicht mehr die Dateien im eigentlich von mir gewollten relativen Pfad erstellen.
Mit dem Flag OFN_NOCHANGEDIR kann man den Quatsch verhindern.