![]() |
Ätsch, Bätsch ausgetrickst. Wenn ich
Delphi-Quellcode:
mache gibts kein Problem, aber nachdem ich nun einfach
inc(integer(aWorkBuffer), sizeOf(PUSERINFO0));
Delphi-Quellcode:
mache, dann gibts ne' AccessViolation...
inc(aWorkBuffer); {oder} inc(integer(aWorkBuffer));
Chris |
Moin Chris,
nein, muss es nicht. So hab' ich das gemacht
Delphi-Quellcode:
und es funktioniert einwandfrei.
function NetUserEnum(
const servername: LPCWSTR; const level: DWORD; const filter: DWORD; const bufptr: Pointer; const prefmaxlen: DWORD; var entriesread: DWORD; var totalentries: DWORD; const resume_handle: PDWORD ): NET_API_STATUS; stdcall; external 'netapi32.dll'; function NetApiBufferFree(const pBuffer : Pointer): NET_API_STATUS; stdcall; external 'netapi32.dll'; procedure TfrmMAIN.miFileOpenClick(Sender: TObject); var rui0Work : PUSER_INFO_0; rui0Save : PUSER_INFO_0; dwEntriesRead : DWORD; i : integer; begin if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, @rui0Work, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesRead, nil) = NERR_SUCCESS then begin rui0Save := rui0Work; for i:=1 to dwEntriesRead do begin ListBox1.Items.Add(rui0Work.usri0_name); [color=red]inc(rui0Work);[/color] end; end; NetAPIBufferFree(rui0Save); end; (Ich hab' sogar mal die Funktionsdeklarationen benutzt, wie es die Jedis machen) |
HILFE!!!! Ich drehe hier noch durch. Also, wenn ich das mache, was du gemacht hast, dann kommt:
Zitat:
Chris |
Moin Luckie,
dann nimm meinetwegen die Jedi Units:
Delphi-Quellcode:
Mein Methode funktioniert trotzdem ;-)
procedure TfrmMAIN.miFileOpenClick(Sender: TObject);
type PUserInfo0 = ^TUserInfo0; _USER_INFO_0 = record usri0_name: LPWSTR; end; TUserInfo0 = _USER_INFO_0; USER_INFO_0 = _USER_INFO_0; var rui0Work : PUserInfo0; rui0Save : PUserInfo0; dwEntriesRead : DWORD; i : integer; begin if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, @rui0Work, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesRead, nil) = NERR_SUCCESS then begin rui0Save := rui0Work; for i:=1 to dwEntriesRead do begin ListBox1.Items.Add(rui0Work.usri0_name); inc(rui0Work); end; end; NetAPIBufferFree(rui0Save); end; (Auch ohne die Jedi Deklarationen anzufassen) |
Also, nochmal *wimmer*:
Delphi-Quellcode:
Kommentare deswegen, dass ich alles schnell wiederrückgängig machen kann. ;)
procedure ListAllUsers(hTreeView: DWORD; hMasterParent: Cardinal; var iEntriesRead: Cardinal);
var aTempIStruct: TTVInsertStruct; aUserBuffer, aWorkBuffer: PUSERINFO0; dwEntriesRead: Cardinal; i: integer; sTemp: string; begin aTempIStruct.item.mask := TVIF_TEXT; {27 =>} if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, @aUserBuffer{<=}, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesRead, nil) = NERR_SUCCESS then begin aWorkBuffer := aUserBuffer; for i:=0 to dwEntriesRead-1 do begin aTempIStruct.hParent := Pointer(hMasterParent); sTemp := {PUserInfo0(}aWorkBuffer{)^}.usri0_name; aTempIStruct.item.pszText := @sTemp[1]; SendMessage(hTreeView, TVM_INSERTITEM, 0, integer(@aTempIStruct)); inc({integer(}aWorkBuffer{), sizeOf(PUSERINFO0)}); end; end; NetAPIBufferFree(aUserBuffer); end; Nun, wenn ich das so mache (die Typen-deklarationen sind bereits in den Units drin; das gleiche, wenn ich sie reinschreibe), dann gibts den Fehler: Zitat:
|
Moin Chris,
könntest Du bitte auch noch mal markieren, was denn Zeile 27 ist? |
Das ist die Zeile in der @aUserBuffer steht. Und an der Stelle steht auch der Cursor... Markieren kann ich auch nochmal machen
Chris |
Moin Chris,
ich dachte die weiter oben gepostete Funktionsdeklaration stamme aus den Jedi Headern, aber die sieht ja so aus:
Delphi-Quellcode:
Wenn hier das var weggelassen würde, würde es auch gehen.
function NetUserEnum(servername: LPCWSTR; level: DWORD; filter: DWORD;
var {<=== VAR statt CONST} bufptr: Pointer; prefmaxlen: DWORD; var entriesread: DWORD; var totalentries: DWORD; resume_handle: PDWORD): NET_API_STATUS; stdcall; Ersatzweise musst Du für @aUserBuffer Pointer(aUserBuffer) schreiben, dann geht's. |
OK. Aber es wäre theoretisch möglich, die Methode von Luckie (2. Source, der anfängt mit "Nach ein paar Unterredungen in ICQ ist folgendes herausgekommen:") zu nutzen, richtig? Denn dann würde ich doch diese Methode nehmen, da diese diejenige ist, dir mir derzeit am ehesten zusagt.
Chris |
Moin Chris,
den hab' ich jetzt zwar nicht ausprobiert, bin aber der Meinung, dass der natürlich auch gehen würde. Wann man den Typecast nun macht spielt ja keine Rolle. Ich find's halt nur einfacher und übersichtlicher den nur einmal zu machen, statt öfter. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 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