Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.120 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Liste aller geöffneten Dateien

  Alt 10. Sep 2003, 14:07
Moin Armin,

dann will ich mal "kurz" meinen Senf dazu geben
Allerdings: Auf meinem lokalen Rechner geht's, ohne Fehlermeldung, auch nicht, nur auf anderen Rechnern, wenn ich die entsprechenden Berechtigungen habe. Die Ursache dafür ist mir auch noch nicht klar.

Delphi-Quellcode:
const
  NERR_Success = 0; // Success
  MAX_PREFERRED_LENGTH = DWORD(-1);

type
  NET_API_STATUS = DWORD;

  PFILE_INFO_2 = ^FILE_INFO_2;
  FILE_INFO_2 = packed record
      fi2_id : DWord;
    end;

  PFILE_INFO_3 = ^FILE_INFO_3;
  FILE_INFO_3 = packed record
      fi3_id : DWord;
      fi3_permissions : DWord;
      fi3_num_locks : DWord;
      fi3_pathname : PWChar;
      fi3_username : PWChar;
    end;

  TcsNetFileEnum = function(
    const servername : PWChar;
    const basepath : PWChar;
    const username : PWChar;
    const level : DWord;
    const bufptr : Pointer;
    const prefmaxlen : DWord;
    const entriesread : PDWord;
    const totalentries : PDWord;
    const resume_handle : PDWord
    ) : NET_API_STATUS; stdcall;

  TcsNetApiBufferFree = function(
    const Buffer : Pointer
    ) : NET_API_STATUS; stdcall;

implementation

var
  hDLL : DWORD;
  NetFileEnum : TcsNetFileEnum = nil;
  NetApiBufferFree : TcsNetApiBufferFree = nil;

{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);

var
  pfi3Work : PFILE_INFO_3;
  pfi3Save : PFILE_INFO_3;
  dwEntriesRead : DWORD;
  dwTotalEntries : DWORD;
  dwResult : DWORD;
  i : integer;

begin
  if (hDLL = 0) or (@NetFileEnum = nil) or (@NetApiBufferFree = nil) then begin
    MessageBox(0,'Fehler beim Laden der Funktionen','FEHLER',MB_ICONERROR);
    exit;
  end;
  Memo1.Lines.Clear;
  dwResult := NetFileEnum(nil,nil ,nil,3,@pfi3Work,MAX_PREFERRED_LENGTH,@dwEntriesRead,@dwTotalEntries,nil);
  if dwResult <> NERR_Success then begin
    MessageBox(0,PChar(SysErrorMessage(dwResult)),'FEHLER',MB_ICONERROR);
    exit;
  end;
  try
    pfi3Save := pfi3Work;
    for i := 1 to dwEntriesRead do begin
      Memo1.Lines.Add(pfi3Save.fi3_pathname + WideString('/') + pfi3Save.fi3_username);
      inc(pfi3Save);
    end;
  finally
    NetApiBufferFree(pfi3Work);
  end;
end;

initialization
begin
  hDLL := LoadLibrary('NETAPI32.DLL');
  if hDLL = 0 then exit;
  @NetFileEnum := GetProcAddress(hDLL,'NetFileEnum');
  @NetApiBufferFree := GetProcAddress(hDLL,'NetApiBufferFree');
end;

finalization
begin
  if hDLL <> 0 then FreeLibrary(hDLL);
end;
Was übrigens immer besonders wichtig ist bei diesen ganzen NetXXXX Funktionen: Als Buffer muss immer die Adresse eines Pointers angegeben werden. Damit ich bei so etwas nicht die Übersicht verliere, hab' ich mir angewöhnt meine Funktionsdeklarationen für API Aufrufe C und nicht borlandtypisch zu erstellen, also immer ohne var Parameter. Dann ist es auch leichter Beispiele zu übersetzen.
Deshalb passen Deine und meine Deklarationen nicht zusammen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat