GetPrivateProfileStringA



  • Kann mir jemand verraten was ich hier falsch mache:

    #include <Windows.h>
    #include <iostream>
    #include <cstring>
    #include <stdio.h>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	//SetConsoleTitle(L"sysCtrl.exe");
    	//FreeConsole();
    
    	char cIP[260], cPort[260], cMethod[260], cTime[260];
    	GetPrivateProfileStringA("Domenic", "ip", "", cIP, sizeof(cIP), "Domenic.ini");
    	cout << cIP << endl;
    	system("PAUSE");
    }
    

    Hatte zuerst GetPrivateProfileString verwendet... Allerdings hatte ich Probleme bei der Konvertierung von WCHAR zu char, da ich für spätere funktionen char brauchte. Bei mir wird einfach nichts ausgegeben in der konsole. 😮



  • Check doch mal den Rückgebewert von GetPrivateprofileString (warum auch immer du die Funktion verwenden willst)...



  • Naja ok...

    The return value is the number of characters copied to the buffer, not including the terminating null character.

    Wie kann ich jetzt den String ausgeben?!
    Und ich wollte deswegen die Funktion benutzen weil ich meine Daten in einer Ini Datei abgespeichert habe?! Und diese gerne auslesen will.



  • Ich meinte damit du sollst überprüfen welchen Wert die Funktion dir zurückliefert, ich würd nämlich wetten dass es 0 ist...



  • Ich bekomme garnichts zurück 😞
    Frag mich trotzdem immer noch woran das liegen könnte.



  • Time2Register schrieb:

    Ich bekomme garnichts zurück 😞

    Was soll das heißen!?



  • Hab die Ini Datei in dem selben ordner wie meine exe.
    Die ini Datei sieht so aus:

    [Domenic]
    ip=TestIP
    port=TestPort
    method=TestMethod
    

    Bei meinem code den ich oben angegeben habe müsste ja eigentlich der Wer "TestIP" in der console erscheinen.
    So siehts aber bei mir aus:
    http://www.bilder-space.de/show_img.php?img=6009b4-1299268341.png&size=original



  • Liegt wohl daran dass die Funktion fehlschlägt...



  • Das meinte dot mit Rückgabe...

    DWORD result = GetPrivateProfileString(...)
    

    Edit:
    Als Test, dass der Pfad falsch ist, kannst Du ja mal probieren dein Pfad absolut anzugeben...

    Edit2:

    Allerdings hatte ich Probleme bei der Konvertierung von WCHAR zu char

    Stell bei den Projekt Einstellungen das Charset auf Multibyte um. Per Default ist es Unicode, was die wchar_t's in Spiel bringt.



  • theta schrieb:

    Stell bei den Projekt Einstellungen das Charset auf Multibyte um. Per Default ist es Unicode, was die wchar_t's in Spiel bringt.

    Wenn dann besser auf Not Set...



  • theta schrieb:

    Das meinte dot mit Rückgabe...

    DWORD result = GetPrivateProfileString(...)
    

    Edit:
    Als Test, dass der Pfad falsch ist, kannst Du ja mal probieren dein Pfad absolut anzugeben...

    Edit2:

    Allerdings hatte ich Probleme bei der Konvertierung von WCHAR zu char

    Stell bei den Projekt Einstellungen das Charset auf Multibyte um. Per Default ist es Unicode, was die wchar_t's in Spiel bringt.

    Jetzt wo ich das Charset auf Multibyte umgestellt habe gehts viel einfacher.
    Vielen dank. Jetzt sieht mein code mittlerweile so aus:

    #include <Windows.h>
    #include <iostream>
    #include <cstring>
    #include <stdio.h>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	SetConsoleTitle("sysCtrl.exe");
    	//FreeConsole();
    
    	char cIP[260], cPort[260], cMethod[260], cTime[260];
    	GetPrivateProfileString("Domenic", "ip", "", cIP, sizeof(cIP), "C:\\Domenic.ini");
    	cout << cIP << endl;
    	system("PAUSE");
    }
    

    Funktioniert alles einwandfrei.
    Allerdings wird die ini auch nur gelesen wenn ich den kompletten Pfad angebe.
    Gibt es da sonnst noch irgendeine möglichkeit? Denn bei jedem ist der Pfad anders und das Programm liegt mit der ini im selben Verzeichnis.



  • #include <string>
    // ...
    std::string getexepath()
      {
      char result[ MAX_PATH ];
      return std::string( result, GetModuleFileName( NULL, result, MAX_PATH ) );
      }
    


  • Allerdings wird die ini auch nur gelesen wenn ich den kompletten Pfad angebe.
    Gibt es da sonnst noch irgendeine möglichkeit? Denn bei jedem ist der Pfad anders und das Programm liegt mit der ini im selben Verzeichnis.

    Ob das geht oder nicht hängt von aktuellen Working Directory ab.
    Das kannst Du z.B. beim Starten angeben und VS macht das und setzt es auf das Verzeichnis wo das Projekt liegt.

    Simon

    **Edit:**Gib doch mal noch das Current Working Dir aus:
    http://msdn.microsoft.com/en-us/library/aa364934(v=vs.85).aspx


  • Mod

    Pfad und INI im selben Verzeichnis ist seit UAC keine gute Idee.
    CSIDL_APPDATA, oder CSIDL_LOCAL_APPDATA wäre meines Erachtens die richtige Wahl.


Log in to reply