![]() |
Freigeben von Pointern von API Funktionen
Ich habe hier folgenden Code und hab eirgendwie ein Brett vorm Kopf:
Delphi-Quellcode:
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?
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; |
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 |
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. ;)
|
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 |
Re: Freigeben von Pointern von API Funktionen
Zitat:
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 |
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.
|
Re: Freigeben von Pointern von API Funktionen
:shock:
Das leuchtet mir jetzt aber nicht ein... |
Re: Freigeben von Pointern von API Funktionen
Zitat:
mfG mirage228 |
Re: Freigeben von Pointern von API Funktionen
kopier die daten, anstatt darauf zu pointen
|
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. |
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