![]() |
Ich vermute mal durch #0 und abgeschlossen wird die Liste mit #0#0.
|
Würde ich ausprobieren, nur gibt obiges folgendes aus (Label1.Caption := aBuffer);
Zitat:
|
So, nachdem ich mir mal die Ausgabestruktur angesehen habe (_USER_INFO_0). Kommt nun raus (Label1.Caption := Buffer.usri0_name):
Zitat:
|
Moin Chris,
kleine Gemeinheit der Netxxx Funktionen. Da die Funktionen den erforderlichen Platz für die Daten selber reservieren, wird als Buffer kein Pointer, sondern die Adresse eines Pointers übergeben. Der Aufruf muss also
Delphi-Quellcode:
lauten.
if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, [color=red]@[/color]aBuffer, MAX_LENGTH, iUsers, iUsers{2}, nil) = NERR_SUCCESS then
Ganz wichtig: Nachdem der Buffer abgearbeitet wurde muss er mit NetApiBufferFree wieder freigegeben werden. Um den Buffer abzuarbeiten empfiehlt es sich eine zweite Variable des Typs anzulegen, und diesem dann den Wert in aBuffer nach Aufruf der Funktion zu übergeben. Wenn man als Parameter prefmaxlen den Wert MAX_PREFERRED_LENGTH angibt erhält man ja alle Einträge, und kann diese dann in einer for Schleife abarbeiten, wobei ein inc(aBuffer) genügt, um auf den nächsten Eintrag zu kommen (wenn man aBuffer vom richtigen Typ her angelegt hat!) Da ich den Zahlenwert der Konstanten MAX_LENGTH nicht kenne: Tausch die lieber mal gegen MAX_PREFERRED_LENGTH aus. |
Hi,
also, ich habe nun 2 Buffer vom Typ _USER_INFO_0 (so steht es auch im PSDK). Nun habe ich folgenden Source:
Delphi-Quellcode:
Allerdings gibt es an der Stelle, wo der Pfeil ist folgenden Fehler:
procedure TMainFrm.FormCreate(Sender: TObject);
var aBuffer1, aBuffer2: _USER_INFO_0; iUsers: Cardinal; begin if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, @aBuffer1,{<-} MAX_PATH+1, iUsers, iUsers{2}, nil) = NERR_SUCCESS then begin aBuffer2 := aBuffer1; NetApiBufferFree(@aBuffer1); Label1.Caption := aBuffer2.usri0_name; end; end; Zitat:
Chris |
Zitat:
Wenn aBuffer vom Typ Pointer ist kann ich ja mit Inc(aBuffer) an den nächsten Eintrag ran. Aber wie bekomme ich jetzt das ganze im Klartext? |
Wenn du den Typ _USER_INFO_0 meinst, dann ist das ganze ein record. Du kannst darauf zugreifen. Wie, steht in irgendeinem der vorangegangenen Sources.
Chris |
Dass das Ding ein Record ist, ist klar. Den kenne ich ja auch. Nur ist es ja nicht ein Record, sondern jeder User hat ja einen Record. Irgendwie so stelle ich mir das vor:
Delphi-Quellcode:
s := aBuffer[0].UserName; // 1. gefundene User
s := aBuffer[1].Username; // 2. gefundene User |
Moin Zusammen,
also ich gehe da von der PSDK Deklaration aus, so dass der Typ von aBuffer ein Pointer auf eine USER_INFO_x Struktur ist. Wie in Delphi sonst üblich einen Record zu übergeben kann ja eigentlich deshalb schon nicht klappen, da man sich ja eine beliebige Anzahl an Einträgen zurückgeben lassen kann, ohne vorher zu Wissen, wieviele es sind. Ein Witz an diesen Netxxx Funktionen ist ja, dass sie den erforderlichen Speicher selber reservieren. aBuffer wäre dann also als
Delphi-Quellcode:
deklariert, so dass man auf diesem Wege das Ergebnis verarbeiten kann
var
aBuffer : PUSER_INFO_1;
Delphi-Quellcode:
Deshalb auch das Sichern von aBuffer in einer Variablen gleichen Typs, da man ja an NetApiBufferFree die Startadresse des Ergebnisbuffers zurückliefern muss, damit der Speicher wieder freigegeben werden kann.
for i := 1 to dwEntriesRead do
begin //... was auch immer mit aBuffer geschehen soll inc(aBuffer); // auf den nächsten Eintrag adressieren end; Als Pointer ist aBuffer in der Funktion nur deshalb deklariert, da es sich um einen Pointer auf verschiedene Datenstrukturen (USER_INF0_x) handeln kann, so dass eine feste Typangabe nicht möglich ist. |
Hi Christian,
ich hatte mir heute auch mal was ausgedacht, werde das nachher mal prüfen, aber nun zu deinem Source: woher kommt dwReadEntries? Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 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