Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C++] Username auslesen (https://www.delphipraxis.net/63051-%5Bc-%5D-username-auslesen.html)

Airblader 13. Feb 2006 13:06


[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:
/* user name */
if( !GetUserName(pData.UserName, &countChar) )
{
   cout << "reading user name failed!" << endl;
}
pData ist ein struct und UserName vom Typ TChar :)
Fehler bekomme ich keinen, wenn ich nun das Ganze aber mit diesem hier ausgeben lasse:

Code:
cout << "user name: " << string(pData.UserName) << endl;
bekomme ich schlichtweg eine ganze Menge eines komischen NonSense-Zeichens.

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

Luckie 13. Feb 2006 13:42

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 );
}

Airblader 13. Feb 2006 13:47

Re: [C++] Username auslesen
 
Auf gut Deutsch GetLatError ausgeben ;)
Bekomme ich ein nettes "122" als Ausgabe. ;)

air

Luckie 13. Feb 2006 13:49

Re: [C++] Username auslesen
 
122: "Der an einen Systemaufruf übergebene Datenbereich ist zu klein." Dein Buffer ist wohl zu klein. Zeig mal mehr Code.

Airblader 13. Feb 2006 13:53

Re: [C++] Username auslesen
 
Nuja, was soll ich groß sagen?

Code:
#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;
Hab praktisch das selbe wie bei msdn (wo du zitiert hast ;) ), nur z.T. andere Namen.

air

Luckie 13. Feb 2006 13:56

Re: [C++] Username auslesen
 
Geht es denn ohne die Struct?

Airblader 13. Feb 2006 13:59

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

Airblader 14. Feb 2006 15:12

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

Luckie 14. Feb 2006 15:19

Re: [C++] Username auslesen
 
Ghet denn mein Code in einem neunen leeren Projekt?

Airblader 14. Feb 2006 15:21

Re: [C++] Username auslesen
 
Seltsam....ja, es geht. Aber was soll mir das sagen? :gruebel:

air

Luckie 14. Feb 2006 15:26

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.

sniper_w 14. Feb 2006 16:00

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;
}

Airblader 14. Feb 2006 17:14

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:

tommie-lie 14. Feb 2006 17:49

Re: [C++] Username auslesen
 
Zitat:

Zitat von sniper_w
Ohne TypeCasting ist bei mir alles OK.

Wo ist ein Typecast? Du meinst wohl Erzeugen eines std::string. ;-)

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:
#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;
}
kompiliert mit gcc -Wall ohne Warnungen und arbeitet wie erwartet.

Airblader 14. Feb 2006 22:09

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 16:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz