Usernamen in C++ auslesen



  • Hallo,
    ich wollte fragen wie ich den Usernamen des Computers in C++ auslesen kann.
    ich habe es so - laut Google - mal ausprobiert:

    #include "stdafx.h"
    #include <Windows.h>
    #include <stdio.h>
    using namespace std;
    
    int main(void)
    {
        char username[20];
        DWORD usernamelen = sizeof(username);
    
        if(!GetUserName(username, &usernamelen))
        {
            printf("Error %d occured\n", (int)GetLastError());
        }
        else
        {
            printf("Username is %s", username);
        }
        return 0;
    }
    

    kriege jedoch folgenden

    1>  kjhgfds.cpp
    1>kjhgfds.cpp(13): error C2664: 'GetUserNameW': Konvertierung des Parameters 1 von 'char [20]' in 'LPWSTR' nicht möglich
    1>          Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    

    Bitte helft mir

    lg timtrucker



  • Das Problem ist dass dein Projekt mit UNICODE kompiliert wird, du aber nur fix einen char Buffer übergibst.
    Verwend TCHAR statt char oder gleich wchar_t + GetUserNameW.



  • Du implementierst in Unicode und vermischst ASCII mit Unicode !

    Zum Einstieg:
    http://www.cplusplus.com/forum/articles/16820/

    #include "stdafx.h"
    #include <Windows.h>
    #include <stdio.h>
    using namespace std;
    
    int main(void)
    {
        wchar_t username[20];
        DWORD usernamelen = 20;
    
        if(!GetUserName(username, &usernamelen))
        {
            printf(_T("Error %d occured\n"), (int)GetLastError());
        }
        else
        {
            printf(_T("Username is %s"), username);
        }
        return 0;
    }
    


  • Bitte ein Bit schrieb:

    Du implementierst in Unicode und vermischst ASCII mit Unicode !

    Zum Einstieg:
    http://www.cplusplus.com/forum/articles/16820/

    #include "stdafx.h"
    #include <Windows.h>
    #include <stdio.h>
    using namespace std;
    
    int main(void)
    {
        wchar_t username[20];
        DWORD usernamelen = 20;
     
        if(!GetUserName(username, &usernamelen))
        {
            printf(_T("Error %d occured\n"), (int)GetLastError());
        }
        else
        {
            printf(_T("Username is %s"), username);
        }
        return 0;
    }
    

    "_T": Bezeichner wurde nicht gefunden.

    😞



  • Ich bin mir ja nicht ganz sicher aber ich meine, dass ich
    using namespace std;
    nur benutzen kann, wenn ich vorher
    #include <iostream>
    hab.
    und dann kannst du das ganze mit
    cout<<
    ausgeben.



  • Wofür überhaupt das using namespace std? Wofür überhaupt stdafx.h? Warum printf()?

    Und selbst wenn, dann so:

    #include "stdafx.h"
    #include <Windows.h>
    #include <cwchar>
    
    int main()
    {
        wchar_t username[20];
        DWORD usernamelen = 20;
    
        if(!GetUserNameW(username, &usernamelen))
        {
            std::wprintf(L"Error %d occured\n", (int)GetLastError());
        }
        else
        {
            std::wprintf(L"Username is %s", username);
        }
        return 0;
    }
    

    oder so

    #include "stdafx.h"
    #include <Windows.h>
    #include <cstdio>
    
    int main()
    {
        char username[20];
        DWORD usernamelen = 20;
    
        if(!GetUserNameA(username, &usernamelen))
        {
            std::printf("Error %d occured\n", (int)GetLastError());
        }
        else
        {
            std::printf("Username is %s", username);
        }
        return 0;
    }
    

    Ist aber natürlich keine perfekte Lösung, denn was wenn der Username länger als 19 Zeichen ist?



  • "_T": Bezeichner wurde nicht gefunden.

    Du musst tchar.h noch includieren.



  • Selbst dann wird printf() immer noch kein wide String Literal akzeptieren.
    _T oder TEXT() bringen nur was wenn du mit TCHAR arbeitest. Wenn du mit wchar_t arbeitest, dann verwend auch einfach die entsprechenden Literale ( L"Hello World" ). Ansonsten hast du wieder das gleiche Problem nur eben in die andere Richtung, nämlich sobald du mal ohne UNICODE kompilierst...


Anmelden zum Antworten