GetUserName
-
weiß vielleicht jemand wo hier der Fehler liegt?
#include <Windows.h> #include <iostream> using namespace std; int main(int argc, char *argv[]) { char *cUserName = 0; unsigned long nUserName = sizeof(cUserName); GetUserName(cUserName, &nUserName); cout << cUserName << endl; system("PAUSE"); return 0; }
Der Debugger spuckt mir die ganze zeit diesen fehler aus:
"Unbehandelte Ausnahme bei 0x0021e820 in UniqueID.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000."
Dabei öffnet sich die strlen.asm Datei die zu dieser Zeile Springt:
"main_loop:
mov eax,dword ptr [ecx] ; read 4 bytes"
-
#include <Windows.h> #include <iostream> using namespace std; int main(int argc, char *argv[]) { char *cUserName = 0; unsigned long nUserName = sizeof(cUserName); GetUserName(cUserName, &nUserName); :arrow_right: cout << cUserName << endl; system("PAUSE"); return 0; }
Ausgabe eines Nullzeigers hat ein undefiniertes Verhalten, weil er auf keine Speicheradresse zeigt.
Edit: falsches Forum.
-
int main(int argc, char *argv[]) { char cUserName[100]; unsigned long nUserName = sizeof(cUserName); GetUserNameA(cUserName, &nUserName); cout << cUserName << endl; system("PAUSE"); return 0; }
-
Jochen Kalmbach schrieb:
int main(int argc, char *argv[]) { char cUserName[100]; unsigned long nUserName = sizeof(cUserName); GetUserNameA(cUserName, &nUserName); cout << cUserName << endl; system("PAUSE"); return 0; }
Danke, habs irgendwie immer noch nicht drauf mit char und char *, obwohl es doch eigendlich so simpel ist. Diese ganzen Typdefinitionen wie "LPSTR" und "LPWSTR" bringen mich auch total durch einander.
-
Und was machst du, wenn der Benutzername länger als 100 Zeichen ist? Besser GetUsername zweimal aufrufen, einmal um die Länge des Benutzernamens zu bekommen und dann zum zweiten mal, um ihn zu bekommen und genügend Speicher zur Verfügung zu stellen.
-
Hab sowieso MAX_PATH verwendet, denke nicht das ein Benutzername so lang ist.
Allerdings hast du trotzdem rechtSicher ist sicher.
-
Hab sowieso MAX_PATH verwendet, denke nicht das ein Benutzername so lang ist.
Das ist der Stoff aus dem Wartungsalbträume und Sicherheitslücken sind.
-
Weiß jemand warum ich hier wiederum nur die Adresse zurück bekomme und nicht den Benutzernamen?
std::string GetUniqueID() { char cUserName[100]; unsigned long nUserName = sizeof(cUserName); if(GetUserName(cUserName, &nUserName) != 0) { std::string szUserName = cUserName; return string(szUserName); } }
-
_Luckie schrieb:
Und was machst du, wenn der Benutzername länger als 100 Zeichen ist? Besser GetUsername zweimal aufrufen, einmal um die Länge des Benutzernamens zu bekommen und dann zum zweiten mal, um ihn zu bekommen und genügend Speicher zur Verfügung zu stellen.
Und was machst du, wenn sich die Länge des Benutzernamens zwischen den beiden GetUserName-Aufrufen ändert?
-
_P schrieb:
_Luckie schrieb:
Und was machst du, wenn der Benutzername länger als 100 Zeichen ist? Besser GetUsername zweimal aufrufen, einmal um die Länge des Benutzernamens zu bekommen und dann zum zweiten mal, um ihn zu bekommen und genügend Speicher zur Verfügung zu stellen.
Und was machst du, wenn sich die Länge des Benutzernamens zwischen den beiden GetUserName-Aufrufen ändert?
Mal ganz davon abgesehen das ein Benutzername nur 20 Zeichen maximal enthalten kann, somit dürften keine Probleme entstehen. Trotzdem wird ich immer noch gerne wissen wie ich in dieser Funktion den Benutzernamen zurück geben lassen kann. Da ich an den Benutzernamen noch einige andere Zeichen hängen möchte und Werte ermitteln möchte, würde ich das ganze gerne in eine Funktion haben. Allerdings klappt es so irgendwie nicht?!
std::string GetUniqueID() { char cUserName[100]; unsigned long nUserName = sizeof(cUserName); if(GetUserName(cUserName, &nUserName) != 0) { std::string szUserName = cUserName; return string(szUserName); } }
-
Bei mir funktioniert dein Code. Schreibst du vielleicht GetUniqueID statt GetUniqueID()?
-
Omg peinlich, das hätte mir doch selber auffallen müssen. Danke...
-
cppasd schrieb:
Mal ganz davon abgesehen das ein Benutzername nur 20 Zeichen maximal enthalten kann
Wo hast du denn das her?
http://technet.microsoft.com/it-it/library/bb726984(en-us).aspxDisplay names must be no more than 64 characters long.
..
Logon names can be up to 104 characters. However, it isn't practical to use logon names that are longer than 64 characters.