GetOpenFileName
-
Hallo,
ich hab ein echtes Problem mit dieser Funktion.
Und zwar geht es um die Standartdialoge:
Die funktionieren bei mir alle (also Farbe, Schrift, Drucken), nur
der OpenDialog und der SaveDialog funktionieren nicht.
Die werden einfach nicht angezeigt und das Program macht weiter.Habe mir alle möglichen Beispielprogramme zum Thema "Datei öffnen" geholt und alle möglichen Tipps (z.B. Strings mit '\0' initialisieren) ausprobiert, aber nichts hat funktioniert. Es passiert einfach nichts.
Ich verwende den Borland Compiler 5.5 und habe auch -tW angegeben.
Habe ich vielleicht vergessen irgendeine notwendige Datei zu includen oder linken?
Und kann mir vielleicht jemand einen Quelltext geben, der eigentlich funktionieren müsste?Thomas
-
Linken musst du comdlg32.lib. Ansonsten solltest du erstmal prüfen, welchen Wert GetOpenFileName zurückliefert. Mit der Funktion CommDlgExtendedError() kriegst du weitere Infos über den Fehler. Oder du postest mal, wie du die OPENFILENAME-Struktur initialisiert hast, wahrscheinlich liegt der Fehler nämlich dort.
-
Hi, also die Struktur sieht so aus
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name// Initialize OPENFILENAME
szFile[0] = '\0';
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.\0Text\0.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;Ein GetOpenFileName gibt an dieser Stelle 0 zurück.
DWORD test;
test = CommDlgExtendedError();ergibt für Test: CDERR_STRUCTSIZE
Thomas
-
Erstens solltest du ALLE Members der Struktur ausfüllen (z.B. hInstance
), und zweitens solltest du in sizeof() den Typnamen verwenden.
-
Hi, danke
Das ganze sieht jetzt so aus:
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name// Initialize OPENFILENAME
szFile[0] = '\0';
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd; // Das Hauptfenster
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("All\0*.\0Text\0.TXT\0");
ofn.lpstrCustomFilter = 0;
ofn.nMaxCustFilter = 0;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = 0;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = 0;
ofn.hInstance = 0;Geht aber trotzdem nicht!
Thomas
-
*lol* Wenn du hInstance auch auf NULL setzt, dann KANN es ja auch nicht funktionieren. Achte mal auf den ersten Parameter der WinMain.
-
Ok, danke.
Hatte das aus nem Beispiel übernommen
jetzt:
ofn.hInstance = hInstance;Geht aber immer noch nicht!
-
TEXT("All\0*.*\0\0Text\0*.TXT\0\0");
-
Hi, danke für die Geduld.
Habs geändert, aber es geht immer noch nicht.
Es kommt immernoch CDERR_STRUCTSIZE.Könnte es sein, dass es gar nicht an sowas liegt?
Die ersten Zeilen vom Programm:#include <windows.h>
#include <commdlg.h>
#include <CDERR.h>
#include <string>
#pragma comment(lib,"comdlg32.lib")using namespace std;
? Fehlt hier vielleicht was?
-
-
Die HINSTANCE brauchst Du nur, wenn Du bei den Flags OFN_ENABLETEMPLATE mit angibst.
-
Du brauchst auch nicht, wie von WebFritzi vorgeschlagen, den Filter-String mit drei Nullern abzuschließen. Zwei reichen völlig aus, das hattest Du schon richtig.
-
Wenn Du CDERR_STRUCTSIZE als Fehler bekommst, sollte dies das Problem lösen:
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400
-
-
Danke King!!!
WebFritzi ist eh ein Dummkopf!"
-
Hi,
ich weiß zwar nicht, wer sich da für mich ausgegeben hat, aber auf jeden Fall war der letzte Eintrag nicht von mir!!!!!!!!
@King: Danke, jetzt funktionierts!
Thomas
-
Hab was dazu bei msdn gefunden.
Und es wundert mich schon ein bisschen. Ich nämlich kein NT 4.0, sondern Win98SE..
-
[EDIT] War Blödsinn [/EDIT]
[ Dieser Beitrag wurde am 22.02.2003 um 20:09 Uhr von WebFritzi editiert. ]
-
Wenn es nach Blödsinn ging, schreib am besten garkeinen Beitrag mehr.
-
Hehe, du kleiner Idiot! Um dich zu ärgern schreib ich gleich gaaanz viel!