Einzelnen Beitrag anzeigen

CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

Alle freigegebenen Ressourcen auflisten

  Alt 25. Sep 2004, 23:23
Hi,
ich versuche gerade ein wenig mit der NetShare*-Funktionen der WinAPI herumzuspielen... Ich habe dazu ja auch schon einen längeren Dialog mit OregonGhost geführt, der mir bei der Lösung eines kleinen Problemes behilflich war.
Mit Hilfe der genannten Funktionen lassen sich die freigebenen Ressourcen relativ einfach verwalten. Ich möchte anhand eines kleinen Beispiels zeigen, wie man die Funktion NetShareEnum verwendet. Sie listet alle Freigaben auf.

Ich gehe davon aus, dass ihr schon eine ListView mit zwei Spalten hinzugefügt habt. Dann braucht ihr nur noch folgenden SourceCode verstehen und umsetzen.
Delphi-Quellcode:
{
Wer die JEDI-Übersetzungen der WinAPI-Header hat, braucht nur die Units JwaLM und JwaLMShare (gaaanz wichtig: beide!!!) einbinden.

Wer sie nicht hat, nimmt einfach diesen Ausschnitt daraus:
}

function NetShareEnum(servername: LMSTR; level: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD;
           entriesread, totalentries, resume_handle: LPDWORD): DWORD; stdcall;

const MAX_PREFERRED_LENGTH = DWORD(-1);

type
  _SHARE_INFO_502 = record
    shi502_netname: LMSTR;
    shi502_type: DWORD;
    shi502_remark: LMSTR;
    shi502_permissions: DWORD;
    shi502_max_uses: DWORD;
    shi502_current_uses: DWORD;
    shi502_path: LMSTR;
    shi502_passwd: LMSTR;
    shi502_reserved: DWORD;
    shi502_security_descriptor: PSECURITY_DESCRIPTOR;
  end;
  PSHARE_INFO_502 = ^_SHARE_INFO_502;

{
Und alles was jetzt kommt muss sowieso jeder machen. Erstmal brauchen wir einen kleinen array-Typen
}

  TShareInfo502Array = Array of _SHARE_INFO_502;
{
Und als nächstes nur schnell unsere kleine Funktion zum Auflisten der Freigaben.
frmMain ist unser Hauptformular, lvShares unsere ListView.
Der Parameter sServerName gibt an, auf welchem Rechner die Freigaben gesucht werden. Wenn nil übergeben wird, werden die lokalen Freigaben verwendet.
}


procedure ListSharedFolders(const sServerName: PWideChar);
var
  aShareBuffer: PSHARE_INFO_502;
  aWorkBuffer: TShareInfo502Array;
  dwEntriesRead: Cardinal;
  i: integer;
  lviNewItem: TListItem;
begin
  // ListView leeren, damit da nichts mehr drin steht
  frmMain.lvShares.Items.Clear;

  // Die Freigaben über die API laden
  NetShareEnum(sServerName, 502, PByte(aShareBuffer), MAX_PREFERRED_LENGTH,
    @dwEntriesRead, @dwEntriesRead, nil);
  // Jetzt den Buffer in ein Array laden, damit es einfer zu verwenden ist
  aWorkBuffer := TShareInfo502Array(aShareBuffer);
  // Freigaben zur ListView adden
  for i:=0 to dwEntriesRead - 1 do begin
    lviNewItem := frmMain.lvShares.Items.Add;
    // Freigabenname
    lviNewItem.Caption := aWorkBuffer[i].shi502_netname;
    // Pfad zur Freigabe auf den lokalen Datenträgern
    lviNewItem.SubItems.Add(aWorkBuffer[i].shi502_path);
    // Kommentare zur Freigabe
    lviNewItem.SubItems.Add(aWorkBuffer[i].shi502_remark);
  end;
end;
Das war's schon.

Weitere Informationen gibt es wie immer im [msdn:cb3a3a4ba5="NetShareEnum"]MSDN[/msdn:cb3a3a4ba5].

Chris

PS: Über Anregungen und Verbesserungsvorschläge würde ich mich freuen.
  Mit Zitat antworten Zitat