Probleme bei Voreinstellung des Dateityps bei CFileDialog [zuvor: CFileDialog::SetDefExt führt zu Acces Violation]



  • Gut, das mit dem Flag habe ich dann hinbekommen, danke, aber daran lag es nicht.

    Weitere Versuche, vernünftig mit dem Pointer umzugehen, schlugen fehl, das selbe Problem wie oben bei:

    CFileDialog schreibdialog(FALSE,NULL,NULL,OFN_EXPLORER,NULL,NULL,NULL);
    	CString dateiname;
    	char dateiendung ='d';
    	LPCSTR endung = &dateiendung;
    	schreibdialog.SetDefExt(endung);
    	if (schreibdialog.DoModal() == IDOK)
    	{
    		dateiname = schreibdialog.GetPathName();
    		MessageBox(static_cast<LPCTSTR>(dateiname));
    	}
    

    also wieder ein Zugriffsverletzung bei SetDefExt.

    Was ist jetzt daran falsch?
    Und wie ist es richtig?

    Danke und Gruß!



  • versuchs mal so

    static char* STR_SCFILTER_H = "Alle Dateien (*.*)\0*.*;\0Header Dateien (*.h)\0*.h;\0\0";
    
    CFileDialog File(FALSE, NULL, NULL, OFN_EXPLORER, NULL, NULL );
    
    //Filter kreterien werden übergeben 
    File.m_ofn.lpstrFilter     		= STR_SCFILTER_H ;
    File.m_ofn.lpstrCustomFilter	= STR_SCFILTER_H ;
    File.m_ofn.lpstrInitialDir 		= "c:\\";
    File.m_ofn.nFilterIndex    		= 1;
    File.m_ofn.lpstrDefExt	   	= "def"; 
    File.m_ofn.lpstrTitle	   	= "Speichern Knallt auf die Platte";
    

    und wenn du es unbeding mit SetDefExt(...) probieren willst wurde ich es mal
    so versuchen

    CString sExt = "ext";
    File.SetDefExt(sExt);
    

    klappt bei mir ohne problem
    auch bei m_ofn.lpstr... kannst du alles mit CString belegen.

    mfg
    LowFly

    [NEW EDIT]
    zum thema flags einfach mal dein ordner von Microsoft scannen hat bei mir unter der commdlg.h folgendes zu tage gebracht

    #define OFN_READONLY 0x00000001
    #define OFN_OVERWRITEPROMPT 0x00000002
    #define OFN_HIDEREADONLY 0x00000004
    #define OFN_NOCHANGEDIR 0x00000008
    #define OFN_SHOWHELP 0x00000010
    #define OFN_ENABLEHOOK 0x00000020
    #define OFN_ENABLETEMPLATE 0x00000040
    #define OFN_ENABLETEMPLATEHANDLE 0x00000080
    #define OFN_NOVALIDATE 0x00000100
    #define OFN_ALLOWMULTISELECT 0x00000200
    #define OFN_EXTENSIONDIFFERENT 0x00000400
    #define OFN_PATHMUSTEXIST 0x00000800
    #define OFN_FILEMUSTEXIST 0x00001000
    #define OFN_CREATEPROMPT 0x00002000
    #define OFN_SHAREAWARE 0x00004000
    #define OFN_NOREADONLYRETURN 0x00008000
    #define OFN_NOTESTFILECREATE 0x00010000
    #define OFN_NONETWORKBUTTON 0x00020000
    #define OFN_NOLONGNAMES 0x00040000 // force no long names for 4.x modules
    #if(WINVER >= 0x0400)
    #define OFN_EXPLORER 0x00080000 // new look commdlg
    #define OFN_NODEREFERENCELINKS 0x00100000
    #define OFN_LONGNAMES 0x00200000 // force long names for 3.x modules
    #define OFN_ENABLEINCLUDENOTIFY 0x00400000 // send include message to callback
    #define OFN_ENABLESIZING 0x00800000



  • Hallo und Danke LowFly, hat aber leider alles nicht geklappt:

    LowFly schrieb:

    und wenn du es unbeding mit SetDefExt(...) probieren willst wurde ich es mal
    so versuchen

    CString sExt = "ext";
    File.SetDefExt(sExt);
    

    Das läßt sich nicht kompilieren:

    (594) : error C2440: 'initializing' : cannot convert from 'const char [4]' to 'ATL::CStringT<BaseType,StringTraits>'
    with
    [
    BaseType=wchar_t,
    StringTraits=StrTraitMFC<wchar_t>
    ]
    Constructor for class 'ATL::CStringT<BaseType,StringTraits>' is declared 'explicit'
    with
    [
    BaseType=wchar_t,
    StringTraits=StrTraitMFC<wchar_t>
    ]
    (595) : error C2664: 'CFileDialog::SetDefExt' : cannot convert parameter 1 from 'CString' to 'LPCSTR'
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

    Naja, mit

    CString sExt = L"ext";
    File.SetDefExt(sExt);
    

    kann man sich wenigstens den ersten Error sparen, aber das reicht natürlich nicht.

    Das andere klappte auch nicht:

    LowFly schrieb:

    versuchs mal so

    static char* STR_SCFILTER_H = "Alle Dateien (*.*)\0*.*;\0Header Dateien (*.h)\0*.h;\0\0";
    
    CFileDialog File(FALSE, NULL, NULL, OFN_EXPLORER, NULL, NULL );
    
    //Filter kreterien werden übergeben 
    File.m_ofn.lpstrFilter     		= STR_SCFILTER_H ;
    File.m_ofn.lpstrCustomFilter	= STR_SCFILTER_H ;
    File.m_ofn.lpstrInitialDir 		= "c:\\";
    File.m_ofn.nFilterIndex    		= 1;
    File.m_ofn.lpstrDefExt	   	= "def"; 
    File.m_ofn.lpstrTitle	   	= "Speichern Knallt auf die Platte";
    

    führt zu:

    cpp(599) : error C2440: '=' : cannot convert from 'char *' to 'LPCWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    ...cpp(600) : error C2440: '=' : cannot convert from 'char *' to 'LPWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    ....cpp(601) : error C2440: '=' : cannot convert from 'const char [4]' to 'LPCWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    ....cpp(603) : error C2440: '=' : cannot convert from 'const char [4]' to 'LPCWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    .....cpp(604) : error C2440: '=' : cannot convert from 'const char [32]' to 'LPCWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

    Na gut, dann machte ich eben die entsprechenden reinterpret_casts:

    schreibdialog.m_ofn.lpstrFilter             = reinterpret_cast<LPCWSTR>(STR_SCFILTER_H) ;
    	schreibdialog.m_ofn.lpstrCustomFilter    = reinterpret_cast<LPWSTR>(STR_SCFILTER_H) ;
    	schreibdialog.m_ofn.lpstrInitialDir         = reinterpret_cast<LPCWSTR>("c:\\");
    	schreibdialog.m_ofn.nFilterIndex            = 1;
    	schreibdialog.m_ofn.lpstrDefExt           = reinterpret_cast<LPCWSTR>("def");
    	schreibdialog.m_ofn.lpstrTitle           = reinterpret_cast<LPCWSTR>("Speichern Knallt auf die Platte");
    

    Das läßt sich dann zwar kompilieren, aber toll sieht der Dialog nicht aus:
    http://img88.imageshack.us/img88/8327/filedlgkv5.png
    (dia anderen Dateitypen sehen genauso aus...)

    und jetzt? 😕



  • Hi,

    kann auch gehen, eigentlich das selbe wie oben:

    CString csFilters="Dat(*.dat)|*.dat|Text Dateien(*.txt)|*.txt|Alle Dateien (*.*)|*.*||";
    
    	CFileDialog FileOpenDlg (FALSE, NULL, NULL, OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, csFilters, this);
    
    	if( FileOpenDlg.DoModal() == IDOK )
    	{
    		//Pfad wird in pathName gespeichert
    		CString pathName = FileOpenDlg.GetPathName();
    	}
    

    grüsse
    pixel

    EDIT: die Standarderweiterung hab ich oben in csFilters gesetzt, das Beispiel funktioniert!



  • ich glaub du hast ein schwerwiegendes problem mit deinen Visual Studios
    installier die mal neu.

    ich hab zwar nen haufen SDK's installiert daran kanns aber nicht liegen denn das was ich dir vorgeschlagen hab ist stan-d-a-r-t und sollte immer funzen.

    oder kann es vieleicht sein das du auch SDK's draufhast und die Dateien aus dem SDK verzeichniss ......//Include ins VC..//Include verzeichniss gekloppt hast??

    oder hast du in deinem Project irgendwelche sonderbaren dateien includet??

    das was dir der da an fehlermeldungen bringt dürfte eigendlich nicht passieren.

    den einen CString an einen LPCSTR übergeben klappt eigendlich immer.

    mfg
    LowFly

    [NEW EDIT]
    LOL 😕
    kann mir einer mal erklären warum s-t-a-n-d-a-r-t
    standart zur hälft mit sternchen gefüllt ist ist das soooooo ein schlimmes wort 😃



  • (D)Evil schrieb:

    {code]LPCSTR => char *[/code]
    Um das mal klar zu stellen 😉

    Du hast das "const" vergessen (um das mal klar zu stellen 😉 )



  • LowFly schrieb:

    [NEW EDIT]
    LOL 😕
    kann mir einer mal erklären warum s-t-a-n-d-a-r-t
    stan**** zur hälft mit sternchen gefüllt ist ist das soooooo ein schlimmes wort 😃

    Vielleicht, weil man Standard hinten mit 'd' schreibt? 😉



  • lol sitmmt hast recht 😃
    erklärt aber nicht warum d-a-r-t als sternchen steht

    im deutschen wie im englischen bedeutet das nix schlimmes zumindest was ich jetzt weis.



  • LowFly schrieb:

    ich glaub du hast ein schwerwiegendes problem mit deinen Visual Studios
    installier die mal neu.

    Also bei meinem Visual Studio handelt es sich um

    Microsoft Visual Studio 2005
    Version 8.0.50727.42
    Microsoft .NET Framework
    Version 2.0.50727

    Installed Edition: Professional

    (Uni-Lizens), an SDKs habe ich nur das DirectX SDK.
    Die von mir beschriebenen Probleme konnte ich an zwei verschiedenen Rechnern nachvollziehen und ansonsten habe ich keine Probleme mit Visual Studio. Da muss noch was schwerwiegenderes passieren, bis ich mich wieder auf die Ochsentour begebe und das neu installiere.... (...was ja echt ewig dauert!)
    Außerdem würde ich vor einer VS Neuinstallation erst mal in den Einstellungen gucken. (Bei mir: Standardeinstellungen außer eben den include und lib directories für DirectX)

    Also: Welches von den Teilproblemen sollte normalerweise nicht auftauchen?
    Sollte z.B. sowas wie "wort" als LPCSTR interpretiert werden?

    jencas schrieb:

    (D)Evil schrieb:

    {code]LPCSTR => char *[/code]
    Um das mal klar zu stellen 😉

    Du hast das "const" vergessen (um das mal klar zu stellen 😉 )

    Und was bedeuted das für mich?



  • Sollte z.B. sowas wie "wort" als LPCSTR interpretiert werden?

    wenn "wort" vom typ CString ist ja, genauso vom typ char*.

    ich hab nicht die 2005 version sondern nur vc6 aber das ist egal. ich arbeite gerade an einem prog das dateien (Multiselcet) ausliest & auch wieder erstellt da übergebe ich an schleifen 1000 mal CString & auch char* an LPCSTR ohne das der compiler motzt oder das tool wärend der laufzeit absürzt.

    beschreib mal den weg wie du deinem vc verklickert hast wo es die dx SDK suchen soll. ich bin mir fast 100%tig sicher das der fehler da zu suchen ist.

    mfg
    LowFly



  • LowFly schrieb:

    beschreib mal den weg wie du deinem vc verklickert hast wo es die dx SDK suchen soll. ich bin mir fast 100%tig sicher das der fehler da zu suchen ist.

    So:
    Visual Studio > Tools > Options > Projects and Solutions > VC++ Directories > Show Directory for: Inculde Files
    und dort als neues Verzeichnis hinzugefügt:
    C:\Programme\Microsoft DirectX SDK (April 2006)\Include
    (ganz oben)

    und:
    Visual Studio > Tools > Options > Projects and Solutions > VC++ Directories > Show Directory for: Libary Files
    und dort als neues Verzeichnis hinzugefügt:
    C:\Programme\Microsoft DirectX SDK (April 2006)\Lib\x86
    (auch ganz oben)

    Ansonsten habe ich nichts gemacht, außer eben der Installation des DX SDKs.

    Ich habe mal versucht, die beiden Zeilen ganz nach unten zu verschieben, allerdings ändert das an den zuvor geschilderten Problemen nichts.

    Siehst Du da einen Fehler bzw. eine andere Möglichkeit?

    Danke und Gruß,
    dong



  • Nachtrag:
    Noch was zum Thema "mein VS kann das, Deins nicht" (oder umgekehrt):
    Zum Error C2440 (*"error C2440: '=' : cannot convert from 'const char ' to 'LPCWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast"
    ) habe ich hier etwas gefunden:

    This error can also be generated as a result of compiler conformance work that was done for Visual C++ 2005: the Visual C++ compiler no longer allows the const_cast Operator to down cast when compiling source code that uses /clr programming.

    To resolve this C2440, use the correct cast operator (for more information, see Casting Operators). See Breaking Changes in the Visual C++ 2005 Compiler for more information.

    Im ersten Anlauf habe ich das noch nicht alles verstanden (außer dem Vorschlag mit den casts, was sich zwar kompiliern ließ, aber zu einem unsinnigen Dialog führte), aber ich probiere da noch etwas herauszufinden...
    (..wenn jemand anderes etwas dazu weiß, braucht er/sie sich von mir aus nicht zurückzuhalten und kann sein Wissen hier gerne ausbreiten... 😉 )
    Gruß,
    dong



  • hmm 😞
    wenn dort auch noch die includeverzeichnisse deines Visual Studios stehn dann nicht. wenn die fehlen sollten dann liegt da das problem. vielicht auch einfach mal nachprüfen ob die pfade so stimmen wie sie dort eingetragen sind. hatte ich auch schon mal das mir vc einfach aus festplatte G:\..\..\\SDK...
    C:\..\\ gemacht hat und dort halt überhaupt nix zu finden war.

    ansonsten kann ich nur sagen neu installieren & vieleicht nicht direckt aus dem web sondern auf platte speichern und dann installieren fals das geht.

    weiter würde mir dann auch nix mehr einfallen evtel. windows nochmal neu installieren kann auch sein das da der fehler liegt.

    oder aber hast du denn die richtigen dateien in dein project eingebunden sprich in die StdAfx.h. LPCSTR braucht entweder die windows.h o die afxwin.h

    wie gesagt die übergaben von CString an LPCSTR MUSS gehen ohne das der compiler motzt



  • LowFly schrieb:

    hmm 😞
    wenn dort auch noch die includeverzeichnisse deines Visual Studios stehn dann nicht. wenn die fehlen sollten dann liegt da das problem.

    Die stehen dort, das ist nicht das Problem. (Stünden sie da nicht, hätte ich wohl noch ganz andere Probleme...)

    LowFly schrieb:

    vielicht auch einfach mal nachprüfen ob die pfade so stimmen wie sie dort eingetragen sind. hatte ich auch schon mal das mir vc einfach aus festplatte G:\..\..\\SDK...C:\..\\ gemacht hat und dort halt überhaupt nix zu finden war.

    Die Pfade sind in Form von Systemvariablen eingetragen (z.B. $(VCInstallDir)bin), die stimmen. (Ich wählte eine Standardinstallation und an meinem System ist auch sonst in dieser Hinsicht nichts exotisch.)

    LowFly schrieb:

    ansonsten kann ich nur sagen neu installieren & vieleicht nicht direckt aus dem web sondern auf platte speichern und dann installieren fals das geht.

    Ich installierte es nicht aus "dem web", sondern von CD aus.

    LowFly schrieb:

    weiter würde mir dann auch nix mehr einfallen evtel. windows nochmal neu installieren kann auch sein das da der fehler liegt.

    ...und vielleicht noch ein paar andere Computer kaufen? 😉
    Ich schrieb bereits, dass ich die verschiedenen Probleme auf zwei verschiedenen Rechnern in gleicher Form nachvollziehen konnte und ich werde mir gewiss nicht wegen jedes Furzes Visual Studio oder gar Windows neuinstallieren.
    Um das klar zu stellen:
    Es ist ja durchaus gelungen, den "Datei speichern" Dialog ohne Zugriffsverletzung aufzurufen, bloß gelang es nie, den Dateityp in der Auswahl vorzugeben. Das Problem sehe ich in der Deklaration der LPCSTR Variablen begründet, ich vermute, dass ich da bisher etwas nicht richtig machte.
    *(Konkret:

    LPCSTR endung = "dat";
    

    könnte vielleicht als Speicheradresse des Poiners interpretiert werden [was die Zugriffsverletzung erklärte.... ...leider äußerte zu diesem Verdacht ja noch niemand sonst seine Meinung....] und

    CString endung = "dat";
    LPSTR endg = reinterpret_cast<LPCSTR>(endung);
    

    funktioniert nicht.)*

    LowFly schrieb:

    oder aber hast du denn die richtigen dateien in dein project eingebunden sprich in die StdAfx.h. LPCSTR braucht entweder die windows.h o die afxwin.h

    Das geschah bereits automatisch (mit der afxwin.h)

    LowFly schrieb:

    wie gesagt die übergaben von CString an LPCSTR MUSS gehen ohne das der compiler motzt

    Ich habe den bereits zitierten Satz:

    This error can also be generated as a result of compiler conformance work that was done for Visual C++ 2005: the Visual C++ compiler no longer allows the const_cast Operator to down cast when compiling source code that uses /clr programming.

    so verstandden, dass sich der Compiler von VS 2005 eben anders verhält als der von VS 6 bezogen auf diesen Error. Oder habe ich das falsch verstanden?

    Naja, dann hat es eben nicht so schlimm zu sein, dass man den Dateityp nicht voreinstellen kann, einen Dateinamenvorschlag klappt immerhin so:

    CFileDialog schreibdialog(FALSE,NULL,static_cast<LPCTSTR>(L"dateiname.dat"),OFN_EXPLORER,NULL,NULL,NULL);
    

    Wenn niemand sonst eine Idee hat, die unterhlab irgendwelcher Neuinstalltionen liegt, kann ich damit leben... 🙂

    Gruß,dong



  • inzwischen habe ich übrigens die Voreinstellung der Dateitypen doch hinbekommen, und zwar so:

    CFileDialog schreibdialog(FALSE, static_cast<LPCTSTR>(L"txt"), static_cast<LPCTSTR>(L"vorgeschlagener Dateiname"), OFN_EXPLORER, static_cast<LPCTSTR>(L"Textdatei (*.txt) |*.txt|Textdatei (*.dat) |*.dat|alle Dateien (*.*) |*.*|" ));
    

    Gruß,
    Dong


Anmelden zum Antworten