[c++ VS2005] GetPrivateProfileString nimmt immer den default Wert

Reticent

Erfahrenes Mitglied
Hallo zusammen,


ich brauche Hilfe bei der Nutzung von GetPrivateProfileString . Und zwar ich habe eine INI-Datei mit folgendem Inhalt:
[MIFARE]
COMPORT=COM3

wenn ich jetzt den Aufruf mache:
Code:
	char	ch_port[4];
	int i_err = GetPrivateProfileString(LPCTSTR("MIFARE"), LPCTSTR("COMPORT"), LPCTSTR("COM1"), LPWSTR(ch_port), 4, _T("D:\Eigene Dateien\Visual Studio 2005\Projects\Chip\Init.ini"));
bekomme ich ch_port = "COM1" und nicht das was in der INI steht. Eben den Defaultwert. Und i_err = 2. Was es heisst habe ich nicht gefunden.

Kann mir jemand behilflich sein? Ich finde im Moment selbst keine Antwort.

Danke.
 
Auf Anhieb fallen mit nur zwei Dinge auf:
1. Du reservierst 4 Byte für den Rückgabewert. Ist der Rückgabestring nullterminiert oder nicht? Wenn ja, dann reichen die 4 Byte nicht, weil denen das \0 abgeht.
2. Deine absolute Pfadangabe enthält \. Müssten das nicht \\ sein, damit sie in C++ richtig interpretiert werden?
 
1. Der Rückgabewert von GetPrivateProfileString ist die Anzahl der kopierten Zeichen ohne die NULL (laut MSDN).
2. Ein Systemfehlerwert 2 heißt normalerweise 'Datei nicht gefunden'.
3. Bist Du sicher, daß in dieser Datei gesucht wird und nicht in der Registry? Was passiert denn, wenn Du WritePrivateProfileString verwendest, um einen Wert in die Datei zu schreiben?
 
die \ habe ich durch \\ ersetzt --> das selbe Ergebnis. Aber \\ ist schon richtig, danke, habe nicht aufgepasst.

\0 spielt, denk ich, keine Rolle, weil alles sowieso auf 4 bytes abgeschnitten wird.


wenn ich
Code:
i_err = WritePrivateProfileString(LPCTSTR("MIFARE"), LPCTSTR("COMPORT"), LPCTSTR("COL1"), TEXT("D:\\Eigene Dateien\\Visual Studio 2005\\Projects\\Chip\\Init.ini"));
ausführe wird mir das
[3 mal ?]
3 mal ?T=2 mal ?
in die INI reingeschrieben . :confused: tut mir Leid wegen 3 und 2 mal. Der Editor hier schneidet mir die Fragezeichen ab wenn ich sie mehr als einmal schreibe.
i_err ist dann = 1. Also wird die Datei schon gefunden. Ich bin mir sicher ich will die INI benutzen.

Was könnte es noch sein?
 
habe grade TEXT statt LPCTSTR versucht. Der WritePrivateProfileString funktioniert jetzt. hm... aber GetPrivateProfileString mit "TEXT" liefert mir C0O0 praktisch "C Null O Null". D.h. jeden Symbol nimmt er als 2 Bytes :confused: Ist es richtig so? Ich kann schon statt 4 die 8 nehmen, aber bin mir nicht sicher, ob es richtig ist. Was meint ihr?

Aber vorher hat er mir doch "COM1" zurückgegeben und nicht "C0O0M010" ! Hmm... wie ist das denn richtig? Es scheint, dass in meiner INI alle Zeichen als 2 Bytes geschrieben sind. Ich habe die INI in Editor erstellt. Soll ich denn jedes mal ein Hexeditor nehmen. Aber das kann ich nicht von Benutzern verlangen.
 
Zuletzt bearbeitet:
neee, ich habe jetzt die INI-Datei in einem HexEditor angeschaut. Die Zeichen sind ohne zusätzliche Nulle. Also liefert mir die Funktion GetPrivateProfileString Falsches Ergebnis. :eek: Das gibts doch nicht.

Bitte, kann mir jemand helfen das ganze zu verstehen und zu korrigieren?
 
so, jetzt habe ich folgendes rausgefunden:

ich bekomme richtiges "COM3" wenn ich statt char* den wchar_t* verwende.
Code:
	wchar_t	ch_port[4];
	int i_err = GetPrivateProfileString(LPCTSTR("MIFARE"), LPCTSTR("COMPORT"), LPCTSTR("COM1"), ch_port, 4, _T("D:\Eigene Dateien\Visual Studio 2005\Projects\Chip\Init.ini"));

So, nur habe ich mir folgendes Problem aufgehalst. In meinem weiteren Programmkod benutze ich überall den ch_port als char*, wie z.B. in der Funktion sprintf(..).

Weiss jemand wie man den wchar_t* in char* richtig konvertieren kann?
 
Lösung gefunden.

Code:
	char new_ch_port[5];
	wcstombs(new_ch_port, wch_port, 5);

damit habe ich meine "COM3" richtig kovertiert.

Danke an alle. Und viel Erfolg an die, denen die Lösung weiterhilft.
 

Neue Beiträge

Zurück