Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   AV bei LookupAccountName (https://www.delphipraxis.net/56671-av-bei-lookupaccountname.html)

Luckie 9. Nov 2005 15:51


AV bei LookupAccountName
 
Ich bekomme mit diesem Code:
Delphi-Quellcode:
const
  MAX_NAME_STRING = 1024;

procedure TForm1.Button3Click(Sender: TObject);
var
  SID: PSID;
  lenSID: DWORD;
  RefDomain: ARRAY[0..MAX_NAME_STRING] OF Char;
  lenRefDomain: DWORD;
  peUse: SID_NAME_USE;
  strSID: String;
begin
  SID := nil;
  LookupAccountName('hal9000', 'Michael', SID, lenSID, RefDomain, lenRefDomain, peUse);
  ConvertSidToStringSidW(SID, strSID);
  ShowMessage(strSID);
end;
bei LookupAccountName eine AccessViolation, ich weiß aber nicht warum. :(

Ultimator 9. Nov 2005 16:02

Re: AV bei LookupAccountName
 
Wenns dich tröstet, ich bekomm auch eine ;)

Luckie 9. Nov 2005 16:05

Re: AV bei LookupAccountName
 
Es liegt an ConvertSidToStringSidW habe ich gemerkt. Hier mein neuer Code:
Delphi-Quellcode:
function GetAccountSid(const Server, User: WideString; var Sid: PSID): DWORD;
var
  dwDomainSize, dwSidSize: DWord;
  R                : LongBool;
  wDomain          : WideString;
  Use              : DWord;
begin
  Result := 0;
  SetLastError(0);
  dwSidSize := 0;
  dwDomainSize := 0;
  R := LookupAccountNameW(PWideChar(Server), PWideChar(User), nil, dwSidSize, nil, dwDomainSize, Use);
  if (not R) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  begin
    SetLength(wDomain, dwDomainSize);
    Sid := GetMemory(dwSidSize);
    R := LookupAccountNameW(PWideChar(Server), PWideChar(User), Sid, dwSidSize, PWideChar(wDomain), dwDomainSize, Use);
    if not R then
    begin
      FreeMemory(Sid);
      Sid := nil;
    end;
  end
  else
    Result := GetLastError;
end;
Delphi-Quellcode:
function ConvertSidToStringSidW(Sid: PSID; var StringSid: String): Bool; stdcall;

implementation

function ConvertSidToStringSidW; external advapi32 name 'ConvertSidToStringSidW';
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  SID: PSID;
  strSID: String;
begin
  SID := nil;
  GetAccountSid('hal9000', 'Michael', SID);
  ConvertSidToStringSidW(SID, strSID);
  ShowMessage(strSID);
end;

Flocke 9. Nov 2005 16:06

Re: AV bei LookupAccountName
 
Setze mal vorher lenRefDomain := MAX_NAME_STRING.
//EDIT: Ok, das hast du korrigiert

var StringSid: String <-- das kann nicht sein - eine API-Funktion mit dem Typen "string"?

Luckie 9. Nov 2005 16:10

Re: AV bei LookupAccountName
 
Ups, habe es so geändert:
Delphi-Quellcode:
function ConvertSidToStringSidW(Sid: PSID; var StringSid: LPCWSTR): Bool; stdcall;
Jetzt bekomme ich aber beim Aufruf:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  SID: PSID;
  strSID: WideString;
begin
  SID := nil;
  GetAccountSid('hal9000', 'Michael', SID);
  ConvertSidToStringSidW(SID, PWideChar(strSID));
  ShowMessage(strSID);
end;
den Fehler:
Zitat:

[Error] Unit1.pas(99): Constant object cannot be passed as var parameter
:gruebel:

Kommando zurück, so geht es:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  SID: PSID;
  strSID: PWideChar;
begin
  SID := nil;
  GetAccountSid('hal9000', 'Michael', SID);
  ConvertSidToStringSidW(SID, strSID);
  ShowMessage(strSID);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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