Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Fehlermeldung bei GetSaveFileName

Empfohlene Antworten

Veröffentlicht

Ich hab mal wieder ein Problemchen :hells:

Und zwar, wenn ich die Funktion GetSaveFileName aufrufe bekomme ich folgenden Fehler:

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:

//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.

Filename ist so in der struct DateiInfo deklariert:

TCHAR	FileName[MAX_PATH];
Initialisieren tue ich es so:
strcpy(Programminfo.Datei.FileName, TEXT(""));

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;

};

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?

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

das liefert den Wert: 9
Das 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.

Achso, dass sind 2 verschiedene Fehlercodes :upps

Wenn ich die Struktur mit ZeroMemory auf NULL setze bekomme ich als Fehlercode 65535.

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;

};

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?

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.