![]() |
[C++] Username auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Hiho ;)
Ich werkel grad etwas mit C++ rum und les dabei ein paar Daten wie PC-Name aus etc. U.a. auch den Usernamen, und zwar so:
Code:
pData ist ein struct und UserName vom Typ TChar :)
/* user name */
if( !GetUserName(pData.UserName, &countChar) ) { cout << "reading user name failed!" << endl; } Fehler bekomme ich keinen, wenn ich nun das Ganze aber mit diesem hier ausgeben lasse:
Code:
bekomme ich schlichtweg eine ganze Menge eines komischen NonSense-Zeichens.
cout << "user name: " << string(pData.UserName) << endl;
Alles andere past aber perfekt - woran kann das liegen? Achja, kann folgende Sache damit zusammenhängen? Ich habe mehrere Bentuzer aufm PC und will eig. per registry einen direkt starten, also ohne auswählen zu müssen. Irgendwie klappt das aber auch nicht, trotz ForceAutoLogon. Ist da vielleicht an meinem System grundlegend was "am Arsch"? :gruebel: Edit: Ich sehe grade, das Auslesen klappt nicht. Lass ich die Ausgabe weg, sehe ich die fehlermeldung, dass er den Usernamen nicht lesen konnte :gruebel: Edit2: Bei nem Kumpel funktionierts irgendwie (WinXP Home). Ich hab XP Prof. Edit3: Hab mal angehängt, was ich bekomme air |
Re: [C++] Username auslesen
Code:
#include <windows.h>
#include <stdio.h> #define INFO_BUFFER_SIZE 32767 void main() { TCHAR Buffer[INFO_BUFFER_SIZE]; DWORD bufCharCount = INFO_BUFFER_SIZE; if( !GetUserName( Buffer, &bufCharCount ) ) printf( "%d, GetLastError()" ); else printf( "\nUser name: %s", Buffer ); } |
Re: [C++] Username auslesen
Auf gut Deutsch GetLatError ausgeben ;)
Bekomme ich ein nettes "122" als Ausgabe. ;) air |
Re: [C++] Username auslesen
122: "Der an einen Systemaufruf übergebene Datenbereich ist zu klein." Dein Buffer ist wohl zu klein. Zeig mal mehr Code.
|
Re: [C++] Username auslesen
Nuja, was soll ich groß sagen?
Code:
Hab praktisch das selbe wie bei msdn (wo du zitiert hast ;) ), nur z.T. andere Namen.
#define INFO_BUFFER_SIZE 32767
struct dataBuf { TCHAR ComputerName[INFO_BUFFER_SIZE]; TCHAR UserName[INFO_BUFFER_SIZE]; TCHAR SysDir[INFO_BUFFER_SIZE]; TCHAR WinDir[INFO_BUFFER_SIZE]; }; ... dataBuf pData; DWORD countChar = INFO_BUFFER_SIZE; if( !GetUserName(pData.UserName, &countChar) ) { cout << GetLastError() << endl; } ... cout << "user name: " << string(pData.UserName) << endl; air |
Re: [C++] Username auslesen
Geht es denn ohne die Struct?
|
Re: [C++] Username auslesen
Ne, auch nich :(
Einziger Unterschied: Am Ende der Zeichen steht nicht der Pfad sondern ein anderes Zeichen (das ich vom Sehen her kenne, aber keinen Namen dafür habe ;) ). Welches das ist, dürfte ja aber wohl eh egal sein... air |
Re: [C++] Username auslesen
*PUSH*
Das es an sich nicht tut, ist zwar nicht wichtig. Nur wie gesagt vermute ich ja förmlich, dass an meinem System was putt is... Jemand noch 'ne Idee (außer Formatieren *fg*) air |
Re: [C++] Username auslesen
Ghet denn mein Code in einem neunen leeren Projekt?
|
Re: [C++] Username auslesen
Seltsam....ja, es geht. Aber was soll mir das sagen? :gruebel:
air |
Re: [C++] Username auslesen
Dass du irgendwas falsch machst. Und es nicht an deinem Computer, sondern an deinem Code liegt. Leider kenne ich mich mit C++ auch nicht so gut aus. Vergleich einfach mal.
|
Re: [C++] Username auslesen
Ohne TypeCasting ist bei mir alles OK.
Code:
#include <iostream>
#include <windows.h> #define INFO_BUFFER_SIZE 32767 struct dataBuf { TCHAR ComputerName[INFO_BUFFER_SIZE]; TCHAR UserName[INFO_BUFFER_SIZE]; TCHAR SysDir[INFO_BUFFER_SIZE]; TCHAR WinDir[INFO_BUFFER_SIZE]; }; dataBuf pData; DWORD countChar = INFO_BUFFER_SIZE; using namespace std; int main() { if( !GetUserName(pData.UserName, &countChar) ) { cout << GetLastError() << endl; } cout << "user name: " << pData.UserName << endl; return 0; } |
Re: [C++] Username auslesen
Also ohne Typecast gehts mir genauso wenig :/
@Luckie Naja, ich habs ja testweise anders gemacht. Und da gings genauso wenig :gruebel: |
Re: [C++] Username auslesen
Zitat:
Der Typ TCHAR ist laut MSDN auf einem Unicode-System als WCHAR definiert. std::string gips aber nicht für wchars, sondern nur für (ANSI-)chars. Mein Compiler wirft mir wenigstens einen Fehler um die Ohren, wenn ich ein wchar_t-Array als Parameter an den std::string()-ctor übergebe. Probier's also mal entweder mit einem Container, der Strings unterstützt (in GNUs libstdc++ zum Bleistift std::wstring, oder std::basic_string<wchar_t> und eine passende Spezialisierung selber implementieren) oder mit einem single-byte Typ, also einfach char[] statt TCHAR[]. Systemabhängige Typen zu verwenden ohne die Funktionen anzupassen ist sowieso eine gefährliche Sache. Wenn du wirklich einen String aus wchars haben willst, solltest du auch GetUserNameW() verwenden. Ich kann zwar nicht ausprobieren, ob das ganze mit GetUserName() funktioniert, aber zumindest das erzeugen eines std::strings aus einem char[] funktioniert bei mir (GCC 4.0.2) wunderbar:
Code:
kompiliert mit gcc -Wall ohne Warnungen und arbeitet wie erwartet.
#include <iostream>
#include <string> int main(int argc, char* argv[]) { char pdata[42]; strcpy(pdata, "blubb"); std::cout << std::string(pdata) << std::endl; return 0; } |
Re: [C++] Username auslesen
Aaaah, ich habs endlich raus ;)
Ganz simpel: countChar wurde einfach zuviel genommen beim Abrufen des Computernamens (wahrsch. alles). Dadurch wurde das zu klein. Simples Neu-Definieren von "countChar = INFO_BUFFER_SIZE;" vor dem Aufruf von GetUserName hat bereits gereicht ;) Danke trotzdem an Alle :) air |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz