Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

Luckie 18. Okt 2004 09:14


Freigeben von Pointern von API Funktionen
 
Ich habe hier folgenden Code und hab eirgendwie ein Brett vorm Kopf:
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;
Da ich mit NetApiBufferFree den Pointer ui3 wieder freigebe, ist logischerweise der Rückgabewert auch verloren. Wie kann ich mein Problem lösen ohne dass ich ein Speicherleck bekomme?

mirage228 18. Okt 2004 09:16

Re: Freigeben von Pointern von API Funktionen
 
Gib die Pointer doch einfach bei Beendigung Deines Programmes frei. Das dürfte am einfachsten sein.

mfG
mirage228

Luckie 18. Okt 2004 09:21

Re: Freigeben von Pointern von API Funktionen
 
Die Funktion wird mehr mal im Programm aufgerufen. Schlechte Lösung. Würde mir auch so nicht gefallen. ;)

Shaman 18. Okt 2004 09:25

Re: Freigeben von Pointern von API Funktionen
 
Ist der Rückgabewert wirklich verloren? Du dereferenzierst den Pointer ja. Somit hast Du im Result eine normale Kopie der Werte, oder? :gruebel:

Gruss
Shaman

mirage228 18. Okt 2004 09:26

Re: Freigeben von Pointern von API Funktionen
 
Zitat:

Zitat von Luckie
Die Funktion wird mehr mal im Programm aufgerufen. Schlechte Lösung. Würde mir auch so nicht gefallen. ;)

Hm, dann wäre es gut zu wissen, was Dein Programm mit den Daten macht bzw. wie(lange) sie angezeigt werden...

Dann könntest Du die ganzen Dinger eventuell in einer Liste speichern und die einzelnen Items dann am Ende des Programmes freigeben.
Oder du hälst eine alle Informationen immer in einem TUserInfo3, die dann angezeigt(ausgewertet?) wird. Bevor neue Informationen reingeholt werden mit Deiner Funktion, ruft Du halt das "NetApiBufferFree" auf.

mfG
mirage228

Luckie 18. Okt 2004 09:27

Re: Freigeben von Pointern von API Funktionen
 
Ja, er ist weg. Wenn ich NetApiBufferFree aufrufe und den Rückgabewert benutzen will, bekomme ich eine AV. Lasse ich das NetApiBufferFree weg, geht es.

Shaman 18. Okt 2004 09:28

Re: Freigeben von Pointern von API Funktionen
 
:shock:

Das leuchtet mir jetzt aber nicht ein...

mirage228 18. Okt 2004 09:30

Re: Freigeben von Pointern von API Funktionen
 
Zitat:

Zitat von Shaman
:shock:

Das leuchtet mir jetzt aber nicht ein...

Also bei einer De-Referenzierung wird eigentlich nichts kopiert ... oder? :gruebel:

mfG
mirage228

Vjay 18. Okt 2004 09:36

Re: Freigeben von Pointern von API Funktionen
 
kopier die daten, anstatt darauf zu pointen

Muetze1 18. Okt 2004 09:38

Re: Freigeben von Pointern von API Funktionen
 
Moin!

Doch, bei der darauffolgenden Zuweisung aber - da es dereferenziert ist...

Ergo: Der Fehler von Luckie leuchtet mir auch überhaupt nicht ein...

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 Uhr.
Seite 1 von 3  1 23      

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