# GetOpenFileName - Name einer Datei auslesen



## Putzwied (22. Mai 2007)

Hi,

ich hab folgendes Problem: Wenn eine bestimmte Datei nicht vorhanden ist, soll ein Open-Dialog aufgehen und der Benutzer kann die Datei dann auswählen.

Allerdings weiß ich nicht, warum das Programm nicht den Pfad sowie Dateiname in ofn.lpstrFile speichert. Folgendes habe ich programmiert:


```
try{ 	
	OPENFILENAME ofn; 				
	HWND hwnd; // owner window	
	ZeroMemory(&ofn, sizeof(OPENFILENAME));
	ofn.lStructSize = sizeof(OPENFILENAME);
	ofn.hwndOwner = hwnd;
	ofn.lpstrFile = NULL;
	ofn.nMaxFile = sizeof(OPENFILENAME);
	ofn.lpstrFilter = "*.ini";
	ofn.nFilterIndex = 1;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = sizeof(OPENFILENAME);
	ofn.lpstrInitialDir = NULL;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 
 
	// Display the Open dialog box.  

	GetOpenFileName(&ofn);	 
	sConfigFileName = (std::string) ofn.lpstrFile;
}
catch( ... ){}
```

Der FileOpen Dialog wird angezeigt, wenn ich aber dann die Datei auswähle und einen Schritt weiter debugge steht nichts in lpstrFile drin.

Der Compiler meldet folgendes:

-		ofn.lpstrFile	0x00000000 <Schlechtes Ptr>	char *
			CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden

Ich brauche den kompletten Pfad der Datei. Dieser sollte doch in der Variable stehen.

Kann mir hier vielleicht jemand weiter helfen?

Gruß,
Buz


----------



## Endurion (22. Mai 2007)

Du musst lpstrFile einen Pointer auf einen Buffer geben, wo dann der Filename reingepackt wird. Wenn du keinen übergibst, kann die Funktion da auch nichts reinsetzen.


----------



## Putzwied (23. Mai 2007)

wenn ich aber mache:


```
char iniFilePath[400];
...
ofn.lpstrFile = iniFilePath;
...
GetOpenFileName(&ofn);	 
sConfigFileName = (std::string) iniFilePath;
```

öffnet er mir den Dialog gar nicht mehr.


----------



## Putzwied (23. Mai 2007)

update:

Er schreibt jetzt mit obigem Code doch was in iniFilePath. Allerdings nicht das was er sollte (den Pfad der gewählten Datei) sondern folgendes:


```
[0]	83 'S'	char
		[1]	0	char
		[2]	0	char
		[3]	0	char
		[4]	54 '6'	char
		[5]	0	char
		[6]	95 '_'	char
		[7]	0	char
		[8]	77 'M'	char
		[9]	0	char
		[10]	105 'i'	char
		[11]	0	char
		[12]	99 'c'	char
		[13]	0	char
		[14]	114 'r'	char
		[15]	0	char
		[16]	111 'o'	char
		[17]	0	char
		[18]	115 's'	char
		[19]	0	char
		[20]	111 'o'	char
		[21]	0	char
		[22]	102 'f'	char
		[23]	0	char
		[24]	116 't'	char
		[25]	0	char
		[26]	46 '.'	char
		[27]	0	char
		[28]	86 'V'	char
		[29]	0	char
		[30]	67 'C'	char
		[31]	0	char
		[32]	56 '8'	char
		[33]	0	char
		[34]	48 '0'	char
		[35]	0	char
		[36]	46 '.'	char
		[37]	0	char
		[38]	68 'D'	char
		[39]	0	char
		[40]	101 'e'	char
		[41]	0	char
		[42]	98 'b'	char
		[43]	0	char
		[44]	117 'u'	char
		[45]	0	char
		[46]	103 'g'	char
		[47]	0	char
		[48]	67 'C'	char
		[49]	0	char
		[50]	82 'R'	char
		[51]	0	char
		[52]	84 'T'	char
		[53]	0	char
		[54]	95 '_'	char
		[55]	0	char
		[56]	49 '1'	char
		[57]	0	char
		[58]	102 'f'	char
		[59]	0	char
		[60]	99 'c'	char
		[61]	0	char
		[62]	56 '8'	char
		[63]	0	char
		[64]	98 'b'	char
		[65]	0	char
		[66]	51 '3'	char
		[67]	0	char
		[68]	98 'b'	char
		[69]	0	char
		[70]	57 '9'	char
		[71]	0	char
		[72]	97 'a'	char
		[73]	0	char
		[74]	49 '1'	char
		[75]	0	char
		[76]	101 'e'	char
		[77]	0	char
		[78]	49 '1'	char
		[79]	0	char
		[80]	56 '8'	char
		[81]	0	char
		[82]	101 'e'	char
		[83]	0	char
		[84]	51 '3'	char
		[85]	0	char
		[86]	98 'b'	char
		[87]	0	char
		[88]	95 '_'	char
		[89]	0	char
		[90]	56 '8'	char
		[91]	0	char
		[92]	46 '.'	char
		[93]	0	char
		[94]	48 '0'	char
		[95]	0	char
		[96]	46 '.'	char
		[97]	0	char
		[98]	53 '5'	char
		[99]	0	char
		[100]	48 '0'	char
		[101]	0	char
		[102]	55 '7'	char
		[103]	0	char
		[104]	50 '2'	char
		[105]	0	char
		[106]	55 '7'	char
		[107]	0	char
		[108]	46 '.'	char
		[109]	0	char
		[110]	52 '4'	char
		[111]	0	char
		[112]	50 '2'	char
		[113]	0	char
		[114]	95 '_'	char
		[115]	0	char
		[116]	120 'x'	char
		[117]	0	char
		[118]	45 '-'	char
		[119]	0	char
		[120]	119 'w'	char
		[121]	0	char
		[122]	119 'w'	char
		[123]	0	char
		[124]	95 '_'	char
		[125]	0	char
		[126]	102 'f'	char
		[127]	0	char
		[128]	55 '7'	char
		[129]	0	char
		[130]	53 '5'	char
		[131]	0	char
		[132]	101 'e'	char
		[133]	0	char
		[134]	98 'b'	char
		[135]	0	char
		[136]	49 '1'	char
		[137]	0	char
		[138]	54 '6'	char
		[139]	0	char
		[140]	99 'c'	char
		[141]	0	char
		[142]	92 '\'	char
		[143]	0	char
		[144]	77 'M'	char
		[145]	0	char
		[146]	83 'S'	char
		[147]	0	char
		[148]	86 'V'	char
		[149]	0	char
		[150]	67 'C'	char
		[151]	0	char
		[152]	82 'R'	char
		[153]	0	char
		[154]	56 '8'	char
		[155]	0	char
		[156]	48 '0'	char
		[157]	0	char
		[158]	68 'D'	char
		[159]	0	char
		[160]	46 '.'	char
		[161]	0	char
		[162]	100 'd'	char
		[163]	0	char
		[164]	108 'l'	char
		[165]	0	char
		[166]	108 'l'	char
```


----------



## Endurion (24. Mai 2007)

Mach mal so:

char iniFilePath[400];
...
ofn.lpstrFile = &iniFilePath[0];
...
GetOpenFileName(&ofn);	 
sConfigFileName = ofn.lpstrFile;


----------



## Putzwied (13. Juni 2007)

Jetzt habe ich ein weiteres Problem:

Wenn ich es als Debug Übersetzte zeigt er mir den Open-Dialog an und alles funktioniert wunderbar.

Wenn ich das ganze nun als Release übersetzen will öffnet er mir den Dialog nicht. Er geht einfach über den Dialog hinweg und tut so als hätte er eine "falsche" bzw keine Datei geöffnet.

Folgendermaßen öffne ich den Dialog:


```
try{
		OPENFILENAME ofn;       // common dialog box structure				
		HWND hwnd;              // owner window					
		// Initialize OPENFILENAME 
		cout << "sizeof ofn: " << sizeof(ofn) << endl;
		ZeroMemory(&ofn, sizeof(ofn));
		ofn.lStructSize = sizeof(ofn);
		ofn.hwndOwner = hwnd;
		ofn.lpstrFile = cIniFilePath;					
		// lpstrFile[0] mit '0' initialisieren damit GetOpenFileName
		// nicht den inhalt von cIniFilePath nimmt um sich zu initialisieren
		ofn.lpstrFile[0] = '\0';
		ofn.nMaxFile = sizeof(cIniFilePath);
		ofn.lpstrFilter = "INI-Dateien\0*.ini\0Alle Dateien\0*.*\0";
		ofn.nFilterIndex = 1;
		ofn.lpstrFileTitle = cIniFile;
		// lpstrFileTitle[0] mit '0' initialisieren damit GetOpenFileName
		// nicht den inhalt von cIniFile nimmt um sich zu initialisieren
		ofn.lpstrFileTitle[0] = '\0';				
		ofn.nMaxFileTitle = sizeof(cIniFilePath);		
		ofn.lpstrInitialDir = NULL;
		ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
		// Fenstertitel setzen
		ofn.lpstrTitle = "Configuration-File fr das Logging whlen";
	
		// FileOpen Dialog anzeigen				
		GetOpenFileName(&ofn);	
		
		// speichern des Pfades und des ConfigFile Namens in den dafr vorhandenen Variablen
		lpszCurDir = cIniFilePath;
		sConfigFileName = (std::string) cIniFile;					
	}
catch( ... )
{	
	// Wenn eine falsche oder keine Datei ausgewhlt wurde, bricht das Programm mit Fehlermeldung ab
	
	MessageBox(NULL, "Logging konnte nicht richtig konfiguriert werden.\n\nProgramm wird beendet.", 
		"Error", MB_ICONWARNING);
	exit( -2 );
}  
// Erneut versuchen Konfigurationsinformationen zu lesen
if(!GetPrivateProfileSection(sSection.c_str(), config, sizeof(config), lpszCurDir))
{
	cout << "erneut versuchen zu lesen" << endl;
	// Wenn eine falsche oder keine Datei ausgewhlt wurde, bricht das Programm mit Fehlermeldung ab
	
	MessageBox(NULL, "Logging konnte nicht richtig konfiguriert werden.\n\nProgramm wird beendet.", 
		"Error", MB_ICONWARNING);
	exit( -2 );
}
```

Er geht nicht in den catch-Block sondern in die nächste if-Abfrage. 
Was gefällt ihm da wenn ich als Release übersetze? :>


----------

