GetOpenFileName() Problem
-
Hallo,
Wenn das im Falschen forum gelandet sein sollte dann sry^^Also folgenes ich beschäftige mich momentan mit der WinAPI und bin nun nachdem Menu darauf gekommen eine Datei zu Öffnen... Ich habe bereits Tutorials darüber gefunden mit einer Standard Dialog Box Dateien zu Öffnen
erstmal der Quelltextausschnitt:
LPWSTR FileOpen(HWND hWnd) { OPENFILENAME ofn; TCHAR szFilter[] = L"Alle Dateien (*.*)\0*.*\0\0"; ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; ofn.hInstance = NULL; ofn.hwndOwner = NULL; ofn.lCustData = 0L; ofn.lpfnHook = NULL; ofn.lpstrCustomFilter = NULL; ofn.lpstrDefExt = NULL; ofn.lpstrFile = 0; ofn.lpstrFileTitle = NULL; ofn.lpstrFilter = szFilter; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = NULL; ofn.lpTemplateName = NULL; ofn.lStructSize = sizeof(ofn); ofn.nFileExtension = 0; ofn.nFileOffset = 0; ofn.nFilterIndex = 0; ofn.nMaxCustFilter = 0; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.pvReserved = NULL; ofn.dwReserved = 0; ofn.FlagsEx = NULL; GetOpenFileName(&ofn); return ofn.lpstrFile; }So, Beim Kompilieren ist noch alles in Ordnung... nur wenn ich dann versuche eine Datei zu Öffnen steht in "ofn.lpstrFile" nichts drin, Also nich der Pfad + Dateiname etc.
Weshalb ich nich weiter damit arbeiten kann...
Deshalb wollte ich fragen ob jemand vllt. einen Fehler in dem Code Entdeckt.
-
du musst in ofn.lpstrFile einen Buffer übergeben, du könntest es so machen:
BOOL FileOpen(HWND hWnd, wchar_t* pBuffer) { // ... ofn.lpstrFile = pBuffer; // ... return GetOpenFileName(&ofn); }der Aufruf:
wchar_t szFileName[MAX_PATH]; FileOpen(hWnd, szFilename); // Jetzt hast du in szFilename den Pfad und Dateinameaber in der gesamten Struktur sind noch Fehler enthalten.
is nur jetzt zu spät...
wenn bis morgen kein anderer geantwortet hat, schreib ich den Rest morgen

MfG DrakoXP
-
Da ist doch sogar extra ein Beispiel in der MSDN zu drin. Mensch Leute, es sollte selbstverständlich sein, erstmal die MSDN und Dr.Google zu konsultieren, bevor man hier ein Thema aufmacht!
-
hihi, die MSDN hat auch sinnlosigkeiten drin^^
MSDN schrieb:
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;lol, und in der MSDN steht aber auch:
MSDN schrieb:
OFN_FILEMUSTEXIST
Specifies that the user can type only names of existing files in the File Name entry field. If this flag is specified and the user enters an invalid name, the dialog box procedure displays a warning in a message box. If this flag is specified, the OFN_PATHMUSTEXIST flag is also used. This flag can be used in an Open dialog box. It cannot be used with a Save As dialog box.kurz: wenn man OFN_FILEMUSTEXIST benutzt, braucht man OFN_PATHMUSTEXIST nicht
-
Durch die MSDN und Dr.Google habich den code ja so zusammengeflickt wie er ist^^
-
also soll ich dir mal den Code vervollständigen?
so, dass er funktioniert?
-
Naja mittlerweile habich ihn zu laufen gekrigt...
Das Problem war scheinbar nur der Fehlende Buffer, nur du sagtest ja das da noch mehr fehler drin seien... und da wäre es nett wenn du die da raus machen könntest^^
-
ich schreibe einfach mal, wie ich es gemacht hätte ^^
// hWnd -> Elternfenster // pBuffer -> ein wchar_t-Puffer mit der Größe MAX_PATH BOOL GetFileNameOpen(HWND hWnd, wchar_t* pBuffer) { if (pBuffer == NULL) // Sicherheitsprüfung! (Leider kann man nicht prüfen, ob der Puffer auch groß genug ist xD return FALSE; OPENFILENAME ofn; ofn.dwReserved = 0; ofn.Flags = OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_LONGNAMES; ofn.FlagsEx = 0; ofn.hInstance = GetModuleHandle(NULL); ofn.hwndOwner = hWnd; ofn.lCustData = NULL; ofn.lpfnHook = NULL; ofn.lpstrCustomFilter = NULL; ofn.lpstrDefExt = NULL; ofn.lpstrFile = pBuffer; ofn.lpstrFileTitle = NULL; ofn.lpstrFilter = L"Textdateien (*.txt)\0*.txt\0Alle Dateien\0*.*\0\0"; // Filter kannste ja machen, wie du ihn brauchst^^ ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = NULL; ofn.lpTemplateName = NULL; ofn.lStructSize = sizeof(OPENFILENAME); ofn.nFileExtension = 0; ofn.nFileOffset = 0; ofn.nFilterIndex = 0; ofn.nMaxCustFilter = 0; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = 0; ofn.pvReserved = NULL; return GetOpenFileName(&ofn); }PS.: wenn du in dem Puffer schon was stehen hast, wird das zur Initialisierung verwendet.
hast du den Puffer also erst erzeugt:wchar_t szFileName[MAX_PATH]; // dann steht da was undefiniertes, und OpenFileName nutzt das zur Initialisierung! // also sicherheitshalber noch das machen: szFileName[0] = L'\0'; // dann geht alles und du kannst GetFileNameOpen(hWnd, szFileName); // machen ;)