AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Freigeben von Pointern von API Funktionen
Thema durchsuchen
Ansicht
Themen-Optionen

Freigeben von Pointern von API Funktionen

Ein Thema von Luckie · begonnen am 18. Okt 2004 · letzter Beitrag vom 18. Okt 2004
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:14
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:16
Gib die Pointer doch einfach bei Beendigung Deines Programmes frei. Das dürfte am einfachsten sein.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:21
Die Funktion wird mehr mal im Programm aufgerufen. Schlechte Lösung. Würde mir auch so nicht gefallen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:25
Ist der Rückgabewert wirklich verloren? Du dereferenzierst den Pointer ja. Somit hast Du im Result eine normale Kopie der Werte, oder?

Gruss
Shaman
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:26
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:27
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:28


Das leuchtet mir jetzt aber nicht ein...
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:30
Zitat von Shaman:


Das leuchtet mir jetzt aber nicht ein...
Also bei einer De-Referenzierung wird eigentlich nichts kopiert ... oder?

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#9

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:36
kopier die daten, anstatt darauf zu pointen
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Freigeben von Pointern von API Funktionen

  Alt 18. Okt 2004, 10:38
Moin!

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

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

MfG
Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz