Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi NetUserEnum die 2. (https://www.delphipraxis.net/2793-netuserenum-die-2-a.html)

CalganX 7. Feb 2003 14:11

Ätsch, Bätsch ausgetrickst. Wenn ich
Delphi-Quellcode:
inc(integer(aWorkBuffer), sizeOf(PUSERINFO0));
mache gibts kein Problem, aber nachdem ich nun einfach
Delphi-Quellcode:
inc(aWorkBuffer); {oder} inc(integer(aWorkBuffer));
mache, dann gibts ne' AccessViolation...

Chris

Christian Seehase 7. Feb 2003 14:12

Moin Chris,

nein, muss es nicht.

So hab' ich das gemacht

Delphi-Quellcode:
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;
und es funktioniert einwandfrei.

(Ich hab' sogar mal die Funktionsdeklarationen benutzt, wie es die Jedis machen)

CalganX 7. Feb 2003 14:16

HILFE!!!! Ich drehe hier noch durch. Also, wenn ich das mache, was du gemacht hast, dann kommt:
Zitat:

[Error] UserInfo.pas(20): Types of actual and formal var parameters must be identical
Allerdings ist bei mir bufptr mit var versehen und so steht es auch bei den Jedis...

Chris

Christian Seehase 7. Feb 2003 14:17

Moin Luckie,

dann nimm meinetwegen die Jedi Units:

Delphi-Quellcode:
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;
Mein Methode funktioniert trotzdem ;-)
(Auch ohne die Jedi Deklarationen anzufassen)

CalganX 7. Feb 2003 14:22

Also, nochmal *wimmer*:
Delphi-Quellcode:
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;
Kommentare deswegen, dass ich alles schnell wiederrückgängig machen kann. ;)
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:

[Error] UserInfo.pas(27): Types of actual and formal var parameters must be identical
Chris

Christian Seehase 7. Feb 2003 14:30

Moin Chris,

könntest Du bitte auch noch mal markieren, was denn Zeile 27 ist?

CalganX 7. Feb 2003 14:32

Das ist die Zeile in der @aUserBuffer steht. Und an der Stelle steht auch der Cursor... Markieren kann ich auch nochmal machen

Chris

Christian Seehase 7. Feb 2003 14:47

Moin Chris,

ich dachte die weiter oben gepostete Funktionsdeklaration stamme aus den Jedi Headern, aber die sieht ja so aus:

Delphi-Quellcode:
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;
Wenn hier das var weggelassen würde, würde es auch gehen.

Ersatzweise musst Du für @aUserBuffer Pointer(aUserBuffer) schreiben, dann geht's.

CalganX 7. Feb 2003 16:50

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

Christian Seehase 7. Feb 2003 17:35

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 23:43 Uhr.
Seite 2 von 4     12 34      

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