Veröffentlicht 28. März 200718 j Ich hab mal wieder ein Problemchen :hells: Und zwar, wenn ich die Funktion GetSaveFileName aufrufe bekomme ich folgenden Fehler: 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: //Dialog zum Speichern aufrufen 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 { [COLOR="Red"]MeldeFehler(CommDlgExtendedError());[/COLOR] } Bei der roten 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.
28. März 200718 j Was ist Programminfo.Datei.FileName genau? Initialisierst du den Rest von DateiMenue auch irgendwo?
28. März 200718 j Filename ist so in der struct DateiInfo deklariert: TCHAR FileName[MAX_PATH]; Initialisieren tue ich es so: strcpy(Programminfo.Datei.FileName, TEXT(""));
28. März 200718 j Hiermit initialisiere ich die OPENFILENAME -Struktur: 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; };
28. März 200718 j Du solltest die ganze Struktur mit ZeroMemory auf NULL setzen, und dann nur die Member zuweisen, die nicht 0 sind. Je nach Compilereinstellungen (Zielbetriebssystem usw.) kann es da nämlich zusätzliche Member geben. Welchen Wert liefert dir CommDlgExtendedError denn?
28. März 200718 j Du solltest die ganze Struktur mit ZeroMemory auf NULL setzen, und dann nur die Member zuweisen, die nicht 0 sind. Je nach Compilereinstellungen (Zielbetriebssystem usw.) kann es da nämlich zusätzliche Member geben. ok, werde ich probieren. Welchen Wert liefert dir CommDlgExtendedError denn? das liefert den Wert: 9
28. März 200718 j das liefert den Wert: 9Das ist CDERR_MEMALLOCFAILURE. Der Windows-Fehlercode ERROR_INVALID_BLOCK ist auch 9, was den Text der Fehlermeldung erklärt. Du kannst die CommDlg-Fehlercodes nicht mit FormatMessage umwandeln, weil sie sich mit den normalen Windows-Fehlercodes überschneiden.
28. März 200718 j Achso, dass sind 2 verschiedene Fehlercodes :upps Wenn ich die Struktur mit ZeroMemory auf NULL setze bekomme ich als Fehlercode 65535.
28. März 200718 j Wenn ich die Struktur mit ZeroMemory auf NULL setze bekomme ich als Fehlercode 65535.Den Wert kann CommDlgExtendedError laut Doku nicht zurückgeben. Wie sieht denn der ganze relevante Code jetzt aus?
28. März 200718 j der Aufruf lautet so: 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 { MeldeFehler(CommDlgExtendedError()); } Die Initialsisierung habe ich nach einem Tipp aus dem C-PLus-Plus Forum verändert, nun bekomme ich wieder den Fehlercode 9. TCHAR Datei[MAX_PATH] = { 0 }; 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).lStructSize = sizeof(*Dateiname); (*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).lpstrFile = Datei; (*Dateiname).nMaxFile = sizeof(Datei);/// sizeof(*Datei);; (*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; };
28. März 200718 j Ich kann das hier bei mir nicht reproduzieren. Der Fehlercode ist auch sehr ungewöhnlich: CDERR_MEMALLOCFAILURE The common dialog box function was unable to allocate memory for internal structures. Sicher, dass du dir nicht vorher schon den Heap zerschossen hast?
28. März 200718 j So lFreunde ich habe es gelöst war triviales Problem und habe ihn net gefunden, das Problem war das 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 END so funktioniert es jetzt Ich danke euch für eure Hielfe
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.