Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Unicode Eingabe einlesen (https://www.delphipraxis.net/85408-unicode-eingabe-einlesen.html)

Luckie 31. Jan 2007 13:30

Re: Unicode Eingabe einlesen
 
Zitat:

Zitat von Olli
Noch immer nicht ganz sattelfest in C/C++, Luckie? :zwinker:

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. :wall:

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. :gruebel:

Olli 31. Jan 2007 13:34

Re: Unicode Eingabe einlesen
 
Zitat:

Zitat von Luckie
Jetzt steht in principal wieder nur ein eckiges Kästchen drinne, anstatt der eingegebenen Zeichenkette. :wall:

Also der von mir gepostete Code funktionierte tadellos auf der Konsole (das wscanf).

Zitat:

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:

Zitat von Luckie
PPS: Wo kann ich beim VS die Zielplattfiorm angegeben? Ich finde da nichts in den Projektoptionen. :gruebel:

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.

Luckie 31. Jan 2007 13:43

Re: Unicode Eingabe einlesen
 
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. :wall:

Olli 31. Jan 2007 14:00

Re: Unicode Eingabe einlesen
 
"#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 ...

Luckie 31. Jan 2007 14:10

Re: Unicode Eingabe einlesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

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.

Olli 31. Jan 2007 14:30

Re: Unicode Eingabe einlesen
 
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 :(

Olli 31. Jan 2007 14:54

Re: Unicode Eingabe einlesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

Luckie 31. Jan 2007 15:17

Re: Unicode Eingabe einlesen
 
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. :gruebel:

Olli 31. Jan 2007 15:26

Re: Unicode Eingabe einlesen
 
Zitat:

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:

Zitat von Luckie
Allerdings verstehe ich nicht, warum du da solche Probleme hattest, ich dachte so was machst du Tag täglich. :gruebel:

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 ... :zwinker:

Luckie 31. Jan 2007 15:40

Re: Unicode Eingabe einlesen
 
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. :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 Uhr.
Seite 3 von 4     123 4      

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