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 2 von 4     12 34      
Olli
(Gast)

n/a Beiträge
 
#11

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 10:58
Ich glaube das war dann wmain. Muesstest du dir mal die Definition fuer _tmain anschauen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 11:34
So. So sieht es bisher aus:
Code:
#include "stdafx.h"
#include <windows.h>
#include <Sddl.h>

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

DWORD GetStrSID(LPCWSTR server, LPCWSTR principal, LPWSTR &StrSID)
{
   // SID ermitteln und in lesbare Form umwandeln
   // in StrSID zurückgeben
   PSID Sid;
   DWORD cbSize = 0;   
   if (LookupAccountNameW(NULL, principal, NULL, &cbSize, NULL, NULL, NULL))
   {
      Sid = (PSID) new BYTE[256];
      LookupAccountNameW(NULL, principal, Sid, &cbSize, NULL, NULL, NULL);
      //ConvertSidToStringSidW(Sid, StrSID);
      delete Sid;
   }
   return GetLastError();
}

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

   wprintf(INFO);
   wprintf(QUERYINPUT);
   wscanf(L"%s", &principal);
   wprintf(L"%s\n", principal);
   LastError = GetStrSID(NULL, principal, StrSID);
   if (LastError == 0)
   {
      wprintf(L"%s", StrSID);
   }
   else
   {
      wprintf(L"%i", LastError);
   }
   getchar();
   return 0;
}
Allerdings kennt er die API-Funktion ConvertSidToStringSidW nicht, obwohl ich die Sddl.h eingebunden und die Advapi32.lib mit gelinkt wird. Benutzen tue ich das Visual Studio 2005.

Ich habe die Funktion erstmal auskommentiert, aber trotzdem kommt es noch zu einer AV beim Aufruf von if (LookupAccountNameW(NULL, principal, NULL, &cbSize, NULL, NULL, NULL)).
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
pitti platsch

Registriert seit: 26. Dez 2006
Ort: Berlin
25 Beiträge
 
Delphi 2005 Professional
 
#13

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 12:03
Es muss wscanf(L"%S", &principal); und nicht wscanf(L"%s", &principal); heißen also ein "%S" statt "%s".
Mit "%s" ließt man char* ein. Mit "%S" wchar_t*
Sollte geh'n...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 12:27
Wenn ich das grosse S nehme, dann kommt in der Funktion GetStrSID nur Mist an.

Ich habe jetzt mal die standard Aufrufkonvention in den Projekteigenschaften von __cdecl auf __stdcall umgestellt, aber das hilft leider auch nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#15

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 12:40
Zitat von pitti platsch:
Es muss wscanf(L"%S", &principal); und nicht wscanf(L"%s", &principal); heißen also ein "%S" statt "%s".
Mit "%s" ließt man char* ein. Mit "%S" wchar_t*
Stimmt, habe ich uebersehen. Allerdings muss der Adressoperator da garnicht stehen. Hatte ich oben schonmal erwaehnt.

Zitat von Luckie:
Wenn ich das grosse S nehme, dann kommt in der Funktion GetStrSID nur Mist an.

Ich habe jetzt mal die standard Aufrufkonvention in den Projekteigenschaften von __cdecl auf __stdcall umgestellt, aber das hilft leider auch nicht.
Das sollte nichts aendern. Ich schaue mal eben kurz drueber.

Code:
#if(_WIN32_WINNT >= 0x0500)
in der sddl.h hattest du aber gesehen?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 12:50
Den Adressoperator hatte ich noch übersehen. Mit %S und ohne Adressoperator geht es jetzt. Und ich bekomme auch keine AV mehr. Allerdings ist cbSize immer null:
Code:
DWORD GetStrSID(LPCWSTR server, LPCWSTR principal, LPWSTR &StrSID)
{
   // SID ermitteln und in lesbare Form umwandeln
   // in StrSID zurückgeben
   PSID Sid;
   DWORD cbSize = 0;   
   LookupAccountNameW(NULL, principal, NULL, &cbSize, NULL, 0, NULL);
   if (cbSize > 0)
   {
      Sid = (PSID) new BYTE[256];
      LookupAccountNameW(NULL, principal, Sid, &cbSize, NULL, 0, NULL);
      wprintf(L"%i", cbSize);
      //ConvertSidToStringSidW(Sid, StrSID);
      delete Sid;
   }
   return GetLastError();
}
Zitat von Olli:
Code:
#if(_WIN32_WINNT >= 0x0500)
in der sddl.h hattest du aber gesehen?
Nein, was bedeutet das für mich? Muss ich da noch irgendwas definieren?

Mann ist das kompliziert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#17

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 13:02
... bla bla bla ...

Code:
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

#ifndef ConvertSidToStringSid
#ifdef __cplusplus
extern "C" {
#endif
BOOL
WINAPI
ConvertSidToStringSidA(
    IN PSID    Sid,
    OUT LPSTR *StringSid
    );
BOOL
WINAPI
ConvertSidToStringSidW(
    IN PSID    Sid,
    OUT LPWSTR *StringSid
    );
#ifdef UNICODE
#define ConvertSidToStringSid ConvertSidToStringSidW
#else
#define ConvertSidToStringSid ConvertSidToStringSidA
#endif // !UNICODE
#ifdef __cplusplus
};
#endif
#endif // ConvertSidToStringSid


#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);
              }
          }
          delete Sid;
      }
      else
      {
          SetLastError(ERROR_NOT_ENOUGH_MEMORY);
      }

   }
   return GetLastError();


int __cdecl _tmain(int argc, _TCHAR* argv[])

   WCHAR principal[80] = {0};
   DWORD LastError;

   wprintf(INFO);
   wprintf(QUERYINPUT);
   wscanf(L"%S", principal);
   wprintf(L"%S\n", principal);
   if (ERROR_SUCCESS == (LastError = GetStrSID(NULL, principal, principal)))
   { 
      wprintf(L"%s", principal);
   } 
   else
   { 
      wprintf(L"Error %d", LastError);
   } 
   getchar();
   return 0;
}
Den ersten Teil kannste weglassen wenn du die korrekte Zielplatform (mind. W2K waehlst). ConvertSidToStringSid, das steht auch in der Doku (PSDK) alloziert den String selber, was du gemacht hast, war also gelinde gesagt Mist.

In einer Domaene funzt dein Ansatz logischerweise so nicht. Wer GetLastError() auswertet sollte im Erfolgsfall auch explizit den Erfolg signalisieren. "new BYTE[256]" war wohl Quark, wenn du offenbar zuvor die exakte Groesse zu ermitteln versuchtest. Also warum nicht auch diese benutzen?
Angehängte Dateien
Dateityp: cpp bla_232.cpp (2,1 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#18

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 13:03
Stoer dich nicht am _tmain, liegt an bestimmten Projekteinstellungen meines Testprojektes (hab's mit dem DDK getestet).
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 13:14
Welche Zielplatform muss ich denn wie, wo einstellen, damit er ConvertSidToStringSidW kennt?

Ansonsten danke erstmal. Da ist ja nicht all zuviel von meinem Code übrig geblieben, da werde ich mich erstmal durchwühlen müssen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#20

Re: Unicode Eingabe einlesen

  Alt 31. Jan 2007, 13:17
Zitat von Luckie:
Welche Zielplatform muss ich denn wie, wo einstellen, damit er ConvertSidToStringSidW kennt?
W2K, wie schon gesagt. Deswegen der Hinweis mit dem Define siehe oben.

Alternativ uebernimmst du den Teil zwischen "#ifndef ConvertSidToStringSid" und "#endif // ConvertSidToStringSid" in deinen Code. Selbst wenn es dann schon woanders deklariert wurde, wird das nicht stoeren und du brauchst Sddl.h nicht mehr explizit einbinden. Statt der ersten beiden Includes waere es bei dir dann wohl nur stdafx.h ...

Zitat von Luckie:
Ansonsten danke erstmal. Da ist ja nicht all zuviel von meinem Code übrig geblieben, da werde ich mich erstmal durchwühlen müssen.
... das ist, bis auf minimale Aenderungen und Sanity-Checks, dein Code. Noch immer nicht ganz sattelfest in C/C++, Luckie?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 05:09 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