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.

    Quelle: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxstructures/openfilename.asp



  • 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 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



  • 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 beschrieben

    DateiMenue.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());
           }
    

Anmelden zum Antworten