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

Filename ist so in der struct DateiInfo deklariert:

TCHAR	FileName[MAX_PATH];
Initialisieren tue ich es so:
strcpy(Programminfo.Datei.FileName, TEXT(""));
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
  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

Geschrieben
  Board00 schrieb:
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
  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?
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:

  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?

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

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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.

Weiterlesen  

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