wulfgang Geschrieben 28. Januar 2009 Teilen Geschrieben 28. Januar 2009 Okay, dann verwende ich Haederdateien. Noch eine andere Frage. Ich verwende GetPrivateProfileString und bekomme schon wieder Probleme mit Datentypen. error C2059: syntax error : ')' error C2664: 'GetPrivateProfileStringW' : cannot convert parameter 1 from 'char [12]' to 'LPCWSTR Das merkwürdige ist, ich habe meinen Code von einem anderen Beitrag hier im Forum http://forum.fachinformatiker.de/c-compiler-ides-apis/72953-ini-datei-erzeugen-schreiben-lesen.html übernommen und er funktioniert nicht. Warum? #include "StdAfx.h" #include "read_serverlist.h" #include <windows.h> #include <fstream> read_serverlist::read_serverlist(void) { char szSectionName[] = "SectionName"; char szKeyName[] = "KeyName"; char szDefaultValue[] = "Value"; char szFilename[] = "serverlist.ini"); BOOL bRet; char szMyValue[128]; GetPrivateProfileString(szSectionName, szKeyName, NULL, szMyValue, sizeof(szMyValue), szFilename); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 28. Januar 2009 Teilen Geschrieben 28. Januar 2009 Das merkwürdige ist, ich habe meinen Code von einem anderen Beitrag hier im Forum http://forum.fachinformatiker.de/c-compiler-ides-apis/72953-ini-datei-erzeugen-schreiben-lesen.html übernommen und er funktioniert nicht. Warum? Wenn du Wide-Chars verwendest, dann nimm auch wide-Chars. Wide character - Wikipedia, the free encyclopedia Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. Januar 2009 Teilen Geschrieben 28. Januar 2009 Noch eine andere Frage. Ich verwende GetPrivateProfileStringBitte mach einen neuen Thread auf, wenn du eine weitere Frage hast, die mit der letzten nichts zu tun hat. Ich trenne das mal ab. Zum ersten Fehler: Ja, was macht die Klammer denn da? Zum zweiten Fehler: Die Funktionen wollen keine char-Arrays, sondern TCHAR-Arrays. Das merkwürdige ist, ich habe meinen Code von einem anderen Beitrag hier im Forum http://forum.fachinformatiker.de/c-compiler-ides-apis/72953-ini-datei-erzeugen-schreiben-lesen.html übernommen und er funktioniert nicht. Warum? Weil du wohl andere Projekteinstellungen hast. Es wäre wirklich an der Zeit, dass du diese Unicode-Geschichte mal verstehst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 28. Januar 2009 Autor Teilen Geschrieben 28. Januar 2009 Weil du wohl andere Projekteinstellungen hast. Kann ich das im Nachherein noch ändern? Mit Projekteinstellungen ist doch die Unicode-Geschichte gemeint? Es wäre wirklich an der Zeit, dass du diese Unicode-Geschichte mal verstehst. Wo kann ich denn darüber was Erfahren? Wikipedia habe ich schon bemüht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 28. Januar 2009 Autor Teilen Geschrieben 28. Januar 2009 (bearbeitet) Also ich bin noch ein Stück weiter gekommen. Der Compiler meckert nicht mehr. Ich bekomme als Ausgabe leider noch gar nichts. Die INI-Datei befindet sich im gleichen Ordner wie die Sourcedateien. Liegt der Fehler bei meinen wchar_t szKeyName[] = L"server"; ? #include "StdAfx.h" #include "read_serverlist.h" #include <windows.h> #include <fstream> #include <wchar.h> #include <wctype.h> #include <iostream> using namespace std; read_serverlist::read_serverlist(void) { wchar_t szSectionName[] = L"onlino"; wchar_t szKeyName[] = L"server"; wchar_t szDefaultValue[] = L"Value"; wchar_t szFilename[] = L"serverlist.ini"; BOOL bRet; wchar_t szValue[128]; GetPrivateProfileString(szSectionName, szKeyName, NULL, szDefaultValue, sizeof(szDefaultValue), szFilename); wcout << szDefaultValue; } Auszug aus meiner INI [onlino] server=onlino login_user=user password=password Bearbeitet 28. Januar 2009 von wulfgang Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. Januar 2009 Teilen Geschrieben 28. Januar 2009 Fehlersuchregel Nummer 1: Rückgabewerte prüfen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 28. Januar 2009 Teilen Geschrieben 28. Januar 2009 Codierung der Datei auf ANSI oder Unicode? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 29. Januar 2009 Autor Teilen Geschrieben 29. Januar 2009 Moin, Fehlersuchregel Nummer 1: Rückgabewerte prüfen. Habe als Rückgabewert 5. Ist ja genau die Länge des Defaults Wertes. Die Funktion findet laut Microsoft-Dokumentation die Eigenschaft server meiner Ini-Datei nicht und setzt deshalb den default-Wert. Wieso? Codierung der Datei auf ANSI oder Unicode? Habe nachgelesen was Unicode/AMSI ist. Mir bleibt wohl hier nichts anderes übrig als mit Unicode. Im Internet findet man meistens aber Beispiele mit ANSI:( Mein Code etwas überarbeitet: wchar_t szSectionName[] = L"onlino"; wchar_t szKeyName_s[] = L"server"; wchar_t servername[] = L"Value"; wchar_t szFilename[] = L"serverlist.ini"; //muss noch variabel gestaltet werden BOOL bRet; wchar_t szMyValue[256]; //Servername wird aus INI-Datei gelesen int laenge; laenge=GetPrivateProfileString(szSectionName, szKeyName_s, servername, szMyValue, sizeof(szMyValue), szFilename); cout << GetLastError()<<"\n"; wcout << szMyValue << " " << laenge; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Januar 2009 Teilen Geschrieben 29. Januar 2009 Wo liegt denn die .ini-Datei? Beim vorletzten Parameter ist übrigens die Größe in Zeichen gefragt, nicht die Größe in Bytes, wie sizeof sie liefert. Da wchar_t größer als 1 Byte ist, ist der Wert zu groß. Du musst das noch durch sizeof(wchar_t) teilen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 29. Januar 2009 Autor Teilen Geschrieben 29. Januar 2009 Du musst das noch durch sizeof(wchar_t) teilen. Jo habe ich jetzt implementiert. Also meine ini ist in dem Ordner, wo meine Sourcedateien sind, wo meine Exe ist und außerdem im übergeordneten Ordner. Gibt es sonst noch eine Fehlerquelle? So schreiben kann ich in die Datei auch: ofstream file("test.txt"); file<<a; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Januar 2009 Teilen Geschrieben 29. Januar 2009 Also meine ini ist in dem Ordner, wo meine Sourcedateien sind, wo meine Exe ist und außerdem im übergeordneten Ordner. Das dürfte das Problem sein. Die MSDN Library sagt zum letzten Parameter: If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 29. Januar 2009 Autor Teilen Geschrieben 29. Januar 2009 (bearbeitet) If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory. Ja, das war es!! Noch eine Frage: Ich möchte mehrere Eigenschaften einlesen. Bei folgendem Code erhalte ich Bei der Ausgabe des Passwortes nur passw statt password. Der Rückgabewert der zweiten Funktion ist 5. Wenn ich selber die Anzahl der einzulesenden Zeichen erhöhe kommt die Meldung die Meldung Run-Time Check Failure #2 - Stack around the variable 'password' was corrupted. Muss ich den Speicher vorher leeeren? Oder was soll das? nt laenge; GetPrivateProfileString(szSectionName, szKeyName_s, servername, nameserver, (sizeof(nameserver))/(sizeof(wchar_t)), szFilename); cout << GetLastError()<<"\n"; wcout << nameserver << " "; //User wird aus INI-Datei gelesen //Passwort wird aus INI-Datei gelesen wchar_t szKeyName_p[] = L"password"; wchar_t password[] = L"Value"; laenge=GetPrivateProfileString(szSectionName, szKeyName_p, servername, password, (sizeof(password))/(sizeof(wchar_t)), //bei z.B 8 obiger Fehler szFilename); wcout << password ; cout << laenge << "\n"; Bearbeitet 29. Januar 2009 von wulfgang Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Januar 2009 Teilen Geschrieben 29. Januar 2009 wchar_t password[] = L"Value"; Wenn du hier keine Größe angibst, ist das Array nur so groß, dass "Value" gerade eben hineinpasst, also 6 (5 Zeichen plus Nullterminierung). Wenn du dann versuchst, einen längeren String hineinzuschreiben, schreibst du in Speicher, der dir nicht gehört. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 29. Januar 2009 Autor Teilen Geschrieben 29. Januar 2009 Ja das funktioniert. Bloß wchar_t password[] = L"Value"; ist ja ein default-Wert. Wenn nun ein Programm-User einen Wert in der ini-Datei ändert, kann er ja nicht immer den Default im Programm ändern. Gibt es da noch eine einfache Möglichkeit mehr Speicher zu reservieren? Oder muss ich mir ganz lange Defaults ausdenken?::helau: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Januar 2009 Teilen Geschrieben 29. Januar 2009 Ich sage doch, "wenn du hier keine Größe angibst". Also könnte die Lösung sein, eine anzugeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 29. Januar 2009 Autor Teilen Geschrieben 29. Januar 2009 Jo, es läuft:D Besten Dank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.