![]() |
LookupAccountSidW und Datenbereich zu klein
Wenn ich folgenden Code ausführe:
Delphi-Quellcode:
fliege ich beim ersten Aufruf von LookupAccountSidW und erhalten den Fehler:
function StrSIDToName(const StrSID: Widestring; var Name: WideString; var SIDType: DWORD): DWORD;
var SID : PSID; Buffer : PWideChar; NameLen, TempLen : Cardinal; err : Boolean; begin SID := nil; err := ConvertStringSIDToSID(PWideChar(StrSID), SID); if err then begin NameLen := 0; TempLen := 0; if LookupAccountSidW(nil, SID, nil, NameLen, nil, TempLen, SIDType) then begin GetMem(Buffer, NameLen); try err := LookupAccountSidW(nil, SID, Buffer, NameLen, nil, TempLen, SIDType); if err then begin SetString(Name, Buffer, Namelen); SetLastError(0); end; finally FreeMem(Buffer); end; end; end; if Assigned(SID) then LocalFree(Cardinal(SID)); result := GetLastError; end; Zitat:
|
Re: LookupAccountSidW und Datenbereich zu klein
Wird denn für "NameLen" trotzdem was vernünftiges zurückgegeben?
mfG mirage228 |
Re: LookupAccountSidW und Datenbereich zu klein
Es ist zumindest größer null.
|
Re: LookupAccountSidW und Datenbereich zu klein
Zitat:
mfG mriage228 |
Re: LookupAccountSidW und Datenbereich zu klein
So hatte ich es ja auch. Aber marabu meinte hier:
![]() Ich habe es jetzt also so:
Delphi-Quellcode:
Aber jetzt fliege ich beim zweiten Aufruf raus und zwar ganz. Das Programm beendet sich im Debugger. Nehme ich die Ansi-Version der Funktion geht es. :gruebel:
function StrSIDToName(const StrSID: Widestring; var Name: WideString; var SIDType: DWORD): DWORD;
var SID : PSID; Buffer : PWideChar; NameLen, TempLen : Cardinal; err : Boolean; begin SID := nil; err := ConvertStringSIDToSID(PWideChar(StrSID), SID); if err then begin NameLen := 0; TempLen := 0; LookupAccountSidW(nil, SID, nil, NameLen, nil, TempLen, SIDType); NameLen := NameLen * 2 + 1; GetMem(Buffer, NameLen); try err := LookupAccountSidW(nil, SID, Buffer, NameLen, nil, TempLen, SIDType); if err then begin SetString(Name, Buffer, Namelen); SetLastError(0); end; finally FreeMem(Buffer); end; end; if Assigned(SID) then LocalFree(Cardinal(SID)); result := GetLastError; end; |
Re: LookupAccountSidW und Datenbereich zu klein
Und was wenn du den Rückgabewert berücksichtigst?
Bringt zwar beim Ansi-Wide-Problem nichts, aber marabu sollte zumindestens nicht meckern. :angel:
Delphi-Quellcode:
function StrSIDToName(const StrSID: Widestring; var Name: WideString; var SIDType: DWORD): DWORD;
var SID : PSID; Buffer : PWideChar; NameLen, TempLen : Cardinal; begin SID := nil; if ConvertStringSIDToSID(PWideChar(StrSID), SID) then begin NameLen := 0; TempLen := 0; if LookupAccountSidW(nil, SID, nil, NameLen, nil, TempLen, SIDType) then result := 0 else result := GetLastError; if (result = 0) or (result = WasWeißIch) then begin GetMem(Buffer, NameLen); try if LookupAccountSidW(nil, SID, Buffer, NameLen, nil, TempLen, SIDType) then begin SetString(Name, Buffer, Namelen); result := 0; end else result := GetLastError; finally FreeMem(Buffer); end; end; end else result := GetLastError; if Assigned(SID) then LocalFree(Cardinal(SID)); end; |
Re: LookupAccountSidW und Datenbereich zu klein
Hm, das überlege ich mir noch mal, denn schön sieht es nicht aus. ;)
|
Re: LookupAccountSidW und Datenbereich zu klein
Na es soll doch wohl "nur" funktionieren und nich in 'ner Galerie ausgestellt werden :oops:
|
Re: LookupAccountSidW und Datenbereich zu klein
marabu hat hier
![]()
Delphi-Quellcode:
Das Problem bleibt aber das gleiche, beim zweiten Aufruf fliege ich einfach ohne Fehlermeldung aus dem Programm.
function StrSIDToName(const StrSID: Widestring; var Name: WideString; var SIDType: DWORD): DWORD;
var SID : PSID; Buffer : PWideChar; NameLen, TempLen : Cardinal; ErrSuccess : Boolean; begin SID := nil; ErrSuccess := ConvertStringSIDToSID(PWideChar(StrSID), SID); if ErrSuccess then begin NameLen := 0; TempLen := 0; LookupAccountSidW(nil, SID, nil, NameLen, nil, TempLen, SIDType); if NameLen > 0 then begin GetMem(Buffer, NameLen + 2); try ErrSuccess := LookupAccountSidW(nil, SID, Buffer, NameLen, nil, TempLen, SIDType); if ErrSuccess then begin SetString(Name, Buffer, Namelen); SetLastError(0); end; finally FreeMem(Buffer); end; end; end; if Assigned(SID) then LocalFree(Cardinal(SID)); result := GetLastError; end; |
Re: LookupAccountSidW und Datenbereich zu klein
NameLen = Chars
oder NameLen = Bytes? :angel:
Delphi-Quellcode:
GetMem(Buffer, (NameLen + 1) * 2);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz