Fehlermeldung bei GetSaveFileName
-
Ich hab mal wieder ein Problemchen.
Und zwar, wenn ich die Funktion GetSaveFileName aufrufe bekomme ich folgenden Fehler:
http://s6.bilder-hosting.de/img/GRFQO.png
Die MessageBox hab ich eingebaut um den kryptischen Fehlercode in einen besseren Fehlertext zu konvertieren:
void MeldeFehler(DWORD Fehlercode) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, Fehlercode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); // Free the buffer. LocalFree( lpMsgBuf ); }Jetzt kommt mein Aufruf:
DateiMenue.lpstrFile = Programminfo.Datei.FileName; if(GetSaveFileName(&DateiMenue)) { FehlerVar = DateiSpeichern(&Programminfo,DateiMenue,&BlockSpeicherHandle,&VerdrahtungsListenHandle); if (FehlerVar != ok) { FehlerMeldung(FehlerVar,&Programminfo,0); Programminfo.Datei.gespeichert = FALSE; return 0; } else Programminfo.Datei.gespeichert = TRUE; } else { [b]MeldeFehler(CommDlgExtendedError());[/b] }Bei der fett markierten Zeile lasse ich mir den Fehler ausgeben und der lautet, wie auf dem Bild zu sehen: Die Adresse des Steuerblocks ist ungültig. Hat jemand eine Idee woran das liegt?
Danke.
-
Und wie hast du die OPENFILENAME Structure gefüllt?
-
Hi Luckie,
ich habe die Struktur so gefüllt:
extern bool InitDateimenue (ProgrammInformation *info,OPENFILENAME *Dateiname) { static TCHAR szFilter[] = TEXT("EX_PRESS - Dateien (*.FUP)\0*.FUP\0") \ //eingefügt// TEXT("MAKRO - Dateien (*.MKR)\0*.MKR\0") \ //eingefügt// TEXT("Alle Dateien (*.*)\0*.*\0\0"); (*Dateiname).lStructSize = sizeof(OPENFILENAME); (*Dateiname).hwndOwner = (*info).handles.Hauptfenster; (*Dateiname).hInstance = (*info).hInstance; (*Dateiname).lpstrFilter = szFilter; (*Dateiname).lpstrCustomFilter = NULL; (*Dateiname).nMaxCustFilter = 0; (*Dateiname).nFilterIndex = 0; (*Dateiname).lpstrFile = NULL; (*Dateiname).nMaxFile = MAX_PATH; (*Dateiname).lpstrFileTitle = NULL; (*Dateiname).nMaxFileTitle = MAX_PATH; (*Dateiname).lpstrInitialDir = NULL; (*Dateiname).lpstrTitle = NULL; (*Dateiname).Flags = OFN_CREATEPROMPT; (*Dateiname).nFileOffset = 0; (*Dateiname).nFileExtension = 0; (*Dateiname).lpstrDefExt = TEXT("FUP"); (*Dateiname).lCustData = 0L; (*Dateiname).lpfnHook = NULL; (*Dateiname).lpTemplateName = NULL; return TRUE; };hilft das weiter?
-
1. Wie und wo ist 'Dateiname' deklariert/definiert ?
2. Bei der Verwendung von bool sollte man auch true und false zurückgeben (nicht TRUE oder FALSE, auch wenn das äquivalent ist).
3. Kennst Du den Pfeiloperator ? ... Der bietet sich hier gerade zu an
.
4. Du solltest hier:(*Dateiname).lStructSize = sizeof(OPENFILENAME);besser schreiben

Dateiname->lStructSize = sizeof(*Dateiname);Das ist dann Typen unabhängig.
5. Hier liegt Dein Problem (also deshalb stürzt/bricht er ab):Bard00 schrieb:
(*Dateiname).lpstrFile = NULL; (*Dateiname).nMaxFile = MAX_PATH;Du musst bei lpstrFile einen Zeiger auf einen nicht konstanten (also beschreibbaren) Buffer (-> TCHAR-Array) übergeben und die Größe davon in nMaxFile angeben. Darin steht dann später die ausgewählte(n) Datei(en).
Siehe auch:
MSDN schrieb:
Pointer to a buffer[...]. When the GetOpenFileName or GetSaveFileName function returns successfully, this buffer contains the drive designator, path, file name, and extension of the selected file.
-
CodeFinder schrieb:
1. Wie und wo ist 'Dateiname' deklariert/definiert ?
als Parameter in der Funktion

CodeFinder schrieb:
2. Bei der Verwendung von bool sollte man auch true und false zurückgeben (nicht TRUE oder FALSE, auch wenn das äquivalent ist).
ist geändert.
CodeFinder schrieb:
3. Kennst Du den Pfeiloperator ? ... Der bietet sich hier gerade zu an
.kene ich, nur ist das Fremdcode und da fummel ich nicht alles um, sondern ergänze es nur noch.
CodeFinder schrieb:
4. Du solltest hier:
(*Dateiname).lStructSize = sizeof(OPENFILENAME);besser schreiben

Dateiname->lStructSize = sizeof(*Dateiname);hab ich geändert.
CodeFinder schrieb:
5. Hier liegt Dein Problem (also deshalb stürzt/bricht er ab):
Bard00 schrieb:
(*Dateiname).lpstrFile = NULL; (*Dateiname).nMaxFile = MAX_PATH;Du musst bei lpstrFile einen Zeiger auf einen nicht konstanten (also beschreibbaren) Buffer (-> TCHAR-Array) übergeben und die Größe davon in nMaxFile angeben. Darin steht dann später die ausgewählte(n) Datei(en).
hab ich gemacht, aber ich bekomme immer noch Fehler 9.
-
Bard00 schrieb:
aber ich bekomme immer noch Fehler 9.
Schön für dich. Und jetzt? Sollen wir raten was für welche und wo im Code?
-
So lFreunde ich habe es gelöst war triviales Problem und habe ihn net gefunden,
das Problem wardas ID_FILE_SAVE_AS falsch geschrieben war (in der resource.rc) hies ursprüngleich ID_FILE_AS
IDR_MENU_EN MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New FUP Project", ID_FILE_NEW MENUITEM "New &MAKRO Project", ID_FILE_MAKRO MENUITEM "&Open", ID_FILE_OPEN MENUITEM "&Save", ID_FILE_SAVE MENUITEM "Save &as", ID_FILE_SAVE_AS MENUITEM SEPARATOR MENUITEM "E&xit", ID_FILE_EXIT ENDso funktioniert es jetzt
Ich danke euch für eure Hielfe
-
Luckie schrieb:
Bard00 schrieb:
aber ich bekomme immer noch Fehler 9.
Schön für dich. Und jetzt? Sollen wir raten was für welche und wo im Code?
Der Code kahm immer hier fast fett markiert ist.
Aber jetzt geht es ja wie oben beschriebenDateiMenue.lpstrFile = Programminfo.Datei.FileName; [b]if(GetSaveFileName(&DateiMenue))[/b] { FehlerVar = DateiSpeichern(&Programminfo,DateiMenue,&BlockSpeicherHandle,&VerdrahtungsListenHandle); if (FehlerVar != ok) { FehlerMeldung(FehlerVar,&Programminfo,0); Programminfo.Datei.gespeichert = FALSE; return 0; } else Programminfo.Datei.gespeichert = TRUE; } else { MeldeFehler(CommDlgExtendedError()); }