GetPrivateProfileString



  • Hallo, ich möchte die Funktion GetPrivateProfileString verwenden um eine ini-Datei zu lesen. Ich erhalte immer die Fehlermeldung:

    error C2664: 'GetPrivateProfileStringW' : cannot convert parameter 1 from 'char [12]' to 'LPCWSTR'

    Hängt das mit dem Unicode zusammen? Was kann ich dagegen tun?

    #include "StdAfx.h"
    #include "read_serverlist.h"
    #include <windows.h>
    #include <fstream> 
    #include <wchar.h>
    #include <wctype.h>
    
    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);
    
    }
    


  • Anstatt "char" lieber "wchar_t" oder "TCHAR" benutzen. Dein Projekt ist auf Unicode eingestellt.

    also zB:

    wchar_t szSectionName[] = L"SectionName";
    

    Das L vor "" nicht vergessen 😉



  • Oder explizit GetPrivateProfileStringA() verwenden :).
    rya.



  • Also der Compiler hat schon mal nichts mehr auszusetzen. 🙂 Aber bei

    cout << szDefaultValue;
    

    als Ausgabe nur einen Zahlen- und Buchstabensalat. Hängt das mit wchar_t zusammen? Muss ich wchar_t wieder in char umwandeln? Wie stelle ich das am besten an?

    #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 szMyValue[128];
    	 GetPrivateProfileString(szSectionName,
    		szKeyName,
    		NULL,
    		szDefaultValue,
    		sizeof(szDefaultValue),
    		szFilename);
    
      cout << szDefaultValue;
    }
    


  • wcout anstatt cout



  • Fehlt da nicht noch auch ein '\0' am Ende von szDefaultValue ?

    Oder hier nicht ??



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo,
    also die Funktion läuft bei mir soweit, dass der Compiler keine Fehler ausspuckt. Leider bekomme ich als Ausgabe auf dem Bildschirm nur den Default-Wert. Für laenge bekomme ich 5. Laut der Microsoft-Hilfe wird der Default Wert ja verwendet, wenn die entsprechende Eigenschaft( bei mir server) nicht gefunden werden kann.
    Kann jemand meinen Fehler sehen? Muss ich bezüglich des Speicherortes der ini noch was beachten?
    Hier mein Code

    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;
    

    Meine Ini:

    [onlino]
    server=onlino
    login_user=user
    password=password
    


  • Hallo, das mit dem Speicherort habe ich inzwischen herrausbekommen.

    Noch eine Frage:
    Ich möchte mehrere Eigenschaften einlesen.
    Bei folgendem Code erhalte ich Bei der Ausgabe des Passwortes nur passw. 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 8 z.B obiger  
                                                                Fehler
    
    		szFilename);
    		wcout << password ;
    		cout << laenge << "\n";
    


  • Du solltest schon ausreichend Speicher zur Verfügung stellen:

    wchar_t password[256];
    

Anmelden zum Antworten