Board00 Geschrieben 28. März 2007 Geschrieben 28. März 2007 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. Zitieren
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 Was ist Programminfo.Datei.FileName genau? Initialisierst du den Rest von DateiMenue auch irgendwo? Zitieren
Board00 Geschrieben 28. März 2007 Autor Geschrieben 28. März 2007 Filename ist so in der struct DateiInfo deklariert: TCHAR FileName[MAX_PATH]; Initialisieren tue ich es so: strcpy(Programminfo.Datei.FileName, TEXT("")); Zitieren
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 Das sieht gut aus. Was ist mit meiner zweiten Frage? Zitieren
Board00 Geschrieben 28. März 2007 Autor Geschrieben 28. März 2007 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; }; Zitieren
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 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? Zitieren
Board00 Geschrieben 28. März 2007 Autor Geschrieben 28. März 2007 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 Zitieren
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 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. Zitieren
Board00 Geschrieben 28. März 2007 Autor Geschrieben 28. März 2007 Achso, dass sind 2 verschiedene Fehlercodes :upps Wenn ich die Struktur mit ZeroMemory auf NULL setze bekomme ich als Fehlercode 65535. Zitieren
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 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? Zitieren
Board00 Geschrieben 28. März 2007 Autor Geschrieben 28. März 2007 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; }; Zitieren
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 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? Zitieren
Board00 Geschrieben 28. März 2007 Autor Geschrieben 28. März 2007 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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.