AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode Eingabe einlesen

Ein Thema von Luckie · begonnen am 30. Jan 2007 · letzter Beitrag vom 1. Feb 2007
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#21

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 14:30
Zitat von Olli:
Noch immer nicht ganz sattelfest in C/C++, Luckie?
Und wenn das so wieter geht, werde ich das auch nie werden:
Code:
int wmain(int argc, _CHAR* argv[])
{
   WCHAR principal[80] = {0};
    DWORD LastError;

    wprintf(INFO);
    wprintf(QUERYINPUT);
    wscanf(L"%S", principal);
    if (ERROR_SUCCESS == (LastError = GetStrSID(NULL, principal, principal)))
    {
       wprintf(L"%s", principal);
    }
    else
    {
       wprintf(L"Error %d", LastError);
    }
    getchar();
    return 0;
}
Jetzt steht in principal wieder nur ein eckiges Kästchen drinne, anstatt der eingegebenen Zeichenkette.

PS: Ich bin hier in einer Domäne. Aber wenn ich einen lokalen Account angebe, sollte es doch funktionieren oder?

PPS: Wo kann ich beim VS die Zielplattfiorm angegeben? Ich finde da nichts in den Projektoptionen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#22

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 14:34
Zitat von Luckie:
Jetzt steht in principal wieder nur ein eckiges Kästchen drinne, anstatt der eingegebenen Zeichenkette.
Also der von mir gepostete Code funktionierte tadellos auf der Konsole (das wscanf).

Zitat von Luckie:
PS: Ich bin hier in einer Domäne. Aber wenn ich einen lokalen Account angebe, sollte es doch funktionieren oder?
Jupp.

Zitat von Luckie:
PPS: Wo kann ich beim VS die Zielplattfiorm angegeben? Ich finde da nichts in den Projektoptionen.
Bei den Praeprozessor-Defines. Als WINNT=0x0500 z.B. ...

Ich schaue nochmal ueber den Code und teste aus an einem lokalen Account. Paar Minuetchen. Muss ja wohl in GetStrSID() haengen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#23

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 14:43
Glaube ich nicht. Es hängt an der Eingabe, dass er da die Eingabe nicht richtig liest, warum auch immer.

Code:
#include "stdafx.h"
#include <windows.h>

#define WINNT 0x0500

#define INFO L"Ausgabe der SIDs zu einem Principal\n"
#define QUERYINPUT L"Principal (z.B. Benutzername): "

DWORD GetStrSID(LPCWSTR server, LPCWSTR principal, WCHAR StrSID[80])
{
   PSID Sid = NULL;
   DWORD cbSize = 0;
   if (LookupAccountNameW(NULL, principal, NULL, &cbSize, NULL, NULL, NULL))
   {
      if(Sid = PSID(new BYTE[cbSize]))
      {
          LPWSTR lpwszTemp = NULL;
          if(LookupAccountNameW(NULL, principal, Sid, &cbSize, NULL, NULL, NULL))
          {
           if(ConvertSidToStringSidW(Sid, &lpwszTemp))
              {
                  // Fill with zeros
                  memset(StrSID, 0, sizeof(StrSID));
                  // Copy string into buffer
                  memcpy(StrSID, lpwszTemp, sizeof(StrSID) - sizeof(WCHAR));
                  // Free the string allocated by ConvertSidToStringSidW
                  LocalFree(HLOCAL(lpwszTemp));
                  SetLastError(ERROR_SUCCESS);
              }
           wprintf(L"%i", cbSize);
          }
          delete Sid;
      }
      else
      {
          SetLastError(ERROR_NOT_ENOUGH_MEMORY);
      }

   }
   return GetLastError();


int wmain(int argc, _TCHAR* argv[])
{
   WCHAR principal[80] = {0};
    DWORD LastError;

    wprintf(INFO);
    wprintf(QUERYINPUT);
    wscanf(L"%S", principal);
    if (ERROR_SUCCESS == (LastError = GetStrSID(NULL, principal, principal)))
    {
       wprintf(L"%s", principal);
    }
    else
    {
       wprintf(L"Error %d", LastError);
    }
    getchar();
    return 0;
}
Ich hatte auch schon WINNT=0x0500 bei den Präprozessiranweisungen hinzugefügt, das hat aber auch nicht geholfen. Und mit #define WINNT 0x0500 geht es auch nicht. Das kann doch einfach nicht so schwer sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#24

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 15:00
"#define _WIN32_WINNT 0x0500" (bzw. _WIN32_WINNT=0x0500)

Ich habe noch zwei subtile Dinge bei deinem Code uebersehen.
1. new fuer Arrays erfordert delete[], niemals delete!
2. new kann eine Exception werfen. Solltest du also danach noch im Zweifelsfall handeln.

Uebrigens, wenn wir schon bei C++ sind, solltest du eventuell lieber I/O Streams benutzen und bei den Formatstrings sollte natuerlich die Puffergroesse Beachtung finden ... also 79 in unserem Fall.



Bei mir liest er die Eingabe voellig korrekt. Also duerftest du nur wieder irgendwelche eigenen Aenderungen gemacht haben. Ich kapier nicht, wieso du nicht einfach meine Aenderungen 1:1 uebernimmst und dann als Ausgangspunkt nimmst. Aber ich mache ohnehin gerade noch ein paar Aenderungen. PSDK lesen hilft uebrigens ... die Funktionsaufrufe sind zT hanebuechen ...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#25

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 15:10
Zitat von Olli:
Bei mir liest er die Eingabe voellig korrekt. Also duerftest du nur wieder irgendwelche eigenen Aenderungen gemacht haben. Ich kapier nicht, wieso du nicht einfach meine Aenderungen 1:1 uebernimmst und dann als Ausgangspunkt nimmst.
Ich habe sie 1:1 übernommen. Ich habe nur das _tmain in wmain geändert. Ich hänge mal das Projekt, wie ich es zur Zeit habe hier an.
Angehängte Dateien
Dateityp: zip sidinfo_344.zip (10,3 KB, 1x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#26

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 15:30
Siehe Anhang mit EXE-Datei. Bitte mal testen ob er einen Fehler bringt. Bei mir kommt leider immer Fehler 1332 (ERROR_NONE_MAPPED), weshalb ich nicht weiter als bis zum ersten LookupAccountName komme
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#27

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 15:54
Autsch. Der letzte Fehler ging auf mich - dank pitti platsch - auf den ich ungeprueft gehoert hatte. Es muss naemlich nicht %S (was bei printf Unicode und bei wprintf ANSI bedeutet), sondern %ws heissen. (%S ist sozusagen immer der "entgegengesetzte" Stringtyp)

Danach funzt der Input und der Rest. Auf die Spur dessen bin ich dann auch erst gekommen, nachdem ich mal ein Literal uebergeben habe.

Siehe Anhang mit EXE und Source. Ausser der Behandlung der Exceptions welche von new() geworfen werden koennten, wird eigentlich alles gecheckt.
Angehängte Dateien
Dateityp: 7z consoleapp1_959.7z (7,4 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#28

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 16:17
Puh jetzt geht es endlich. Mann war das eine schwere Geburt. Jetzt muss ich mir nur noch angucken, was da genau passiert, um es zu verstehen.

Allerdings verstehe ich nicht, warum du da solche Probleme hattest, ich dachte so was machst du Tag täglich.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#29

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 16:26
Zitat von Luckie:
Puh jetzt geht es endlich. Mann war das eine schwere Geburt. Jetzt muss ich mir nur noch angucken, was da genau passiert, um es zu verstehen.
Verstehe ich noch immer nicht. Soll ich es nochmal schnell durchkommentieren?

Zitat von Luckie:
Allerdings verstehe ich nicht, warum du da solche Probleme hattest, ich dachte so was machst du Tag täglich.
Was? Einen kranken Mix aus C und C++? Nö, ich schreibe entweder richtig C oder richtig C++ ... normalerweise aber C++. Und da benutzt man (siehe meine Kommentare zu Streams) keine bekloppten Formatstrings, sondern verläßt sich auf die Typsicherheit des Compilers.

Ein Teil der Probleme ergab sich allerdings daraus, daß ich den Fehler eben an einer anderen Stelle vermutet hatte (nämlich beim Lookup). Aber durch deinen Hinweis bzgl. der Eingabe habe ich mich dann auf den anderen Teil gestürzt und prompt den Fehler gefunden. Übrigens gibt's im Kernelmode auch relativ selten Eingabeaufforderungen ... soviel zum tagtäglichen ...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#30

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 16:40
OK, ich versuche dass dann noch mal mit Streams hinzubekommen, damit es ein sauberes C++ wird. Und dann poste ich es nochmal hier.

Irgendwann muss ich das doch mit den Zeichenketten und C/C++ in den Kopf bekommen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 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