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.
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?
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(""));
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 Das sieht gut aus. Was ist mit meiner zweiten Frage?
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; };
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?
Board00 Geschrieben 28. März 2007 Autor Geschrieben 28. März 2007 Klotzkopp schrieb: 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. Klotzkopp schrieb: Welchen Wert liefert dir CommDlgExtendedError denn? das liefert den Wert: 9
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 Board00 schrieb: 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.
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.
Klotzkopp Geschrieben 28. März 2007 Geschrieben 28. März 2007 Board00 schrieb: 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?
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; };
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: Zitat 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?
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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden