Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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;

};

Geschrieben

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?

Geschrieben
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

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

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;

};

Geschrieben

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?

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...