Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

Olli 31. Jan 2007 10:58

Re: Unicode Eingabe einlesen
 
Ich glaube das war dann wmain. Muesstest du dir mal die Definition fuer _tmain anschauen.

Luckie 31. Jan 2007 11:34

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

pitti platsch 31. Jan 2007 12:03

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

Luckie 31. Jan 2007 12:27

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

Olli 31. Jan 2007 12:40

Re: Unicode Eingabe einlesen
 
Zitat:

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:

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?

Luckie 31. Jan 2007 12:50

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

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

Olli 31. Jan 2007 13:02

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

Olli 31. Jan 2007 13:03

Re: Unicode Eingabe einlesen
 
Stoer dich nicht am _tmain, liegt an bestimmten Projekteinstellungen meines Testprojektes (hab's mit dem DDK getestet).

Luckie 31. Jan 2007 13:14

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

Olli 31. Jan 2007 13:17

Re: Unicode Eingabe einlesen
 
Zitat:

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:

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.

:gruebel: ... das ist, bis auf minimale Aenderungen und Sanity-Checks, dein Code. Noch immer nicht ganz sattelfest in C/C++, Luckie? :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 Uhr.
Seite 2 von 4     12 34      

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