Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Freigeben von Pointern von API Funktionen (https://www.delphipraxis.net/32054-freigeben-von-pointern-von-api-funktionen.html)

franktron 18. Okt 2004 09:44

Re: Freigeben von Pointern von API Funktionen
 
Also in der Funktion ist der Fehler nicht das muss gehen vieleicht kommt die EV woanders her.

Zeig doch mal wie der Type aufgebaut ist und die auswertung wo die EV kommt.

Luckie 18. Okt 2004 09:49

Re: Freigeben von Pointern von API Funktionen
 
Also noch mal alles zusammen:

Delphi-Quellcode:
type
  TUserInfo3 = record
    usri3_name: LPWSTR;
    usri3_password: LPWSTR;
    usri3_password_age: DWORD;
    usri3_priv: DWORD;
    usri3_home_dir: LPWSTR;
    usri3_comment: LPWSTR;
    usri3_flags: DWORD;
    usri3_script_path: LPWSTR;
    usri3_auth_flags: DWORD;
    usri3_full_name: LPWSTR;
    usri3_usr_comment: LPWSTR;
    usri3_parms: LPWSTR;
    usri3_workstations: LPWSTR;
    usri3_last_logon: DWORD;
    usri3_last_logoff: DWORD;
    usri3_acct_expires: DWORD;
    usri3_max_storage: DWORD;
    usri3_units_per_week: DWORD;
    usri3_logon_hours: PBYTE;
    usri3_bad_pw_count: DWORD;
    usri3_num_logons: DWORD;
    usri3_logon_server: LPWSTR;
    usri3_country_code: DWORD;
    usri3_code_page: DWORD;
    usri3_user_id: DWORD;
    usri3_primary_group_id: DWORD;
    usri3_profile: LPWSTR;
    usri3_home_dir_drive: LPWSTR;
    usri3_password_expired: DWORD;
  end;
  PUserInfo3 = ^TUserInfo3;
Delphi-Quellcode:
function GetUserInfo(Server, User: string): TUserInfo3;
var
  ui3: Pointer;
  NetError: DWORD;
begin
  if User <> '' then
  begin
    try
      NetError := NetUserGetInfo(PWideChar(WideString(Server)),
        PWideChar(WideString(User)), 3, ui3);
      if NetError = NERR_SUCCESS then
      begin
        result.usri3_name := PUserInfo3(ui3)^.usri3_name;
        result.usri3_full_name := PUserInfo3(ui3)^.usri3_full_name;
        result.usri3_comment := PUserInfo3(ui3)^.usri3_comment;
        result.usri3_home_dir := PUserInfo3(ui3)^.usri3_home_dir;
        result.usri3_password_age := PUserInfo3(ui3)^.usri3_password_age;
        result.usri3_last_logon := PUserInfo3(ui3)^.usri3_last_logon;
        result.usri3_num_logons := PUserInfo3(ui3)^.usri3_num_logons;
        result.usri3_password_expired :=
          PUserInfo3(ui3)^.usri3_password_expired;
        result.usri3_flags := DWORD(PUserInfo3(ui3)^.usri3_flags and
          UF_PASSWD_CANT_CHANGE = UF_PASSWD_CANT_CHANGE);
        result.usri3_flags := DWORD(PUserInfo3(ui3)^.usri3_flags and
          UF_DONT_EXPIRE_PASSWD = UF_DONT_EXPIRE_PASSWD);
        result.usri3_flags := DWORD(PUserInfo3(ui3)^.usri3_flags and
          UF_ACCOUNTDISABLE = UF_ACCOUNTDISABLE);
      end;
    finally
      //NetApiBufferFree(ui3);
    end;
  end;
end;
Und der Aufruf:
Delphi-Quellcode:
type
  TUser = packed record
    Name: String[255];
    UserGroups: string[255];
  end;
  TUsers = array of TUser;

[..]

function GetUsers(Computer: String): TUsers;
var
  Users: TStringArray;
  i: Integer;
  ui3: TUserInfo3;
  UserGroups: TStringArray;
  s: PWideChar;
begin
  UserGroups := nil;
  Users := EnumUsers(Computer, FILTER_NORMAL_ACCOUNT);
  setlength(result, length(Users));
  for i := 0 to length(Users) - 1 do
  begin
    ui3 := GetUserInfo(Computer, Users[i]);
    result[i].Name := String(ui3.usri3_name);
  end;
end;

Motzi 18. Okt 2004 09:51

Re: Freigeben von Pointern von API Funktionen
 
Also wenn ich das richtig seh, dann sind zumindest diese Felder
Code:
      usri3_name
      usri3_full_name
      usri3_comment
      usri3_home_dir
Strings, weswegen ich den Fehler beim internen String-Handling vermute. Ruf mal für jedes Feld deines Results, das ein String oder WideString is die Funktion UniqueString() auf...

Edit: zu spät.. ich hab mir die Deklaration von TUserInfo3 aus deiner NTUser-Unit angeguckt.. warum hast du denn von den Delphi-Strings auf LPWSTR umgestellt?

Luckie 18. Okt 2004 10:09

Re: Freigeben von Pointern von API Funktionen
 
Umgestellt? Die war schon immer so.

Motzi 18. Okt 2004 10:28

Re: Freigeben von Pointern von API Funktionen
 
Hm.. vielleicht hab ich einfach eine alte Version, aber bei mir schaut die so aus:
Delphi-Quellcode:
type
  // See Microsoft documentation for details
  TUserInfo_3 = record // record for user information, incomplete!
    Name: string;
    FullName: string;
    Comment: string;
    HomeDir: string;
    Password: string;
    PasswordAge: DWORD; // in seconds
    LastLogon: DWORD; // Specifies a DWORD value that indicates when the last
                      // logon occurred. This value is stored as the
                      // number of seconds that have elapsed since 00:00:00,
                      // January 1, 1970, GMT
    NumLogons: DWORD;
    PasswordExpired: DWORD;
    PasswordCantChange: DWORD;
    PasswordDontExpire: DWORD;
    MustChangePW: DWORD;
    AccountDisable: DWORD;
  end;
Bin daher davon ausgegangen, dass es sich um Strings handelt...

franktron 18. Okt 2004 10:29

Re: Freigeben von Pointern von API Funktionen
 
Wo kommt den die EV

Delphi-Quellcode:
  hier => ui3 := GetUserInfo(Computer, Users[i]);
  oder hier => result[i].Name := String(ui3.usri3_name);

Luckie 18. Okt 2004 10:45

Re: Freigeben von Pointern von API Funktionen
 
Wenn ich NetApiBufferFree aufrufe, dann steht hier nach:
Delphi-Quellcode:
ui3 := GetUserInfo(Computer, Users[i]);
nichts in dem Record drinne. Und die AV kommt dann in der nächsten Zeile.

Motzi 18. Okt 2004 11:18

Re: Freigeben von Pointern von API Funktionen
 
Ist ja auch klar, nachdem du nur den Pointer kopierst, aber nicht dessen Inhalt..

hab mal ein bisschen rumprobiert und mit 2 einfachen Typecasts geht es:
Delphi-Quellcode:
function GetUserInfo(Server, User: string): TUserInfo3;
var
  ui3: Pointer;
  NetError: DWORD;
begin
  if User <> '' then
  begin
    try
      NetError := NetUserGetInfo(PWideChar(WideString(Server)),
        PWideChar(WideString(User)), 3, ui3);
      if NetError = NERR_SUCCESS then
      begin
        result.usri3_name := LPWSTR(WideString(PUserInfo3(ui3)^.usri3_name));
        result.usri3_full_name := LPWSTR(WideString(PUserInfo3(ui3)^.usri3_full_name));
        result.usri3_comment := LPWSTR(WideString(PUserInfo3(ui3)^.usri3_comment));
        result.usri3_home_dir := LPWSTR(WideString(PUserInfo3(ui3)^.usri3_home_dir));
        result.usri3_password_age := PUserInfo3(ui3)^.usri3_password_age;
        result.usri3_last_logon := PUserInfo3(ui3)^.usri3_last_logon;
        result.usri3_num_logons := PUserInfo3(ui3)^.usri3_num_logons;
        result.usri3_password_expired :=
          PUserInfo3(ui3)^.usri3_password_expired;
        result.usri3_flags := DWORD(PUserInfo3(ui3)^.usri3_flags and
          UF_PASSWD_CANT_CHANGE = UF_PASSWD_CANT_CHANGE);
        result.usri3_flags := DWORD(PUserInfo3(ui3)^.usri3_flags and
          UF_DONT_EXPIRE_PASSWD = UF_DONT_EXPIRE_PASSWD);
        result.usri3_flags := DWORD(PUserInfo3(ui3)^.usri3_flags and
          UF_ACCOUNTDISABLE = UF_ACCOUNTDISABLE);
      end;
    finally
      NetApiBufferFree(ui3);
    end;
  end;
end;

Luckie 18. Okt 2004 11:22

Re: Freigeben von Pointern von API Funktionen
 
In dem Record sind es dann Strings oder?

Motzi 18. Okt 2004 11:30

Re: Freigeben von Pointern von API Funktionen
 
Nein, den Record hab ich so lassen wie du ihn deklariert hast...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.
Seite 2 von 3     12 3      

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