Newsgroup: it.comp.lang.delphi
Titolo: Chi mi aiuta con "WNetOpenEnum,WNetEnumResource" ?

Scusate se apro un'altro post, ma spero che stavolta possa esser d'aiuto a
qualcun'altro...
Cercavo un modo per elencare le cartelle condivise da un pc sulla rete
locale ed ho trovato la procedura che vedete sotto (ritorna la lista in una
tstring).
Il problema č che la procedura elenca TUTTE le share di TUTTE le macchine
che trova nella lan (sia nello stesso gruppo di lavoro che negli altri).
Vorrei modificarla in modo tale da potergli passare il nome del PC del quale
voglio trovarme le condivisioni, ma non c'ho cavato un ragno dal buco.
Ho capito che non bisogna passargli "nil", in quanto questo parametro indica
che la "scansione" deve avvenire dalla "root" della rete.
Qualcuno puň dirmi che cavolo devo passargli come valore?, non ho mai messo
mano alle api di windows, e credo che per me sia un pň troppo, non sono cosě
"esperto" da capire i parametri da passare alle varie funzioni chiamate
(WNetOpenEnum,WNetEnumResource).
Grazie dell'aiuto!
Eccovi la funzione:
procedure GetNetworkedDrives( strings: TStrings);
  procedure EnumNetworkDrives( pnr : PNetResource);
  var
    hEnum: THandle;
    i, enumRes, count, BufferSize: DWORD;
    buffer: pointer;
  begin
    BufferSize := $4000; //ie: use a 16kb buffer
    buffer := nil;  //just in case memory allocation fails
    if WNetOpenEnum(RESOURCE_GLOBALNET,
      RESOURCETYPE_DISK, 0, pnr, hEnum) = ERROR_SUCCESS then
    try
      GetMem(buffer, BufferSize);
      while true do
      begin
        count := dword(-1); //ie: get as many items possible
        enumRes := WNetEnumResource(hEnum,
          count, buffer, BufferSize);
        //break if either no more items found or an error occurs...
        if (enumRes <> ERROR_SUCCESS) then break;
        pnr := buffer; //reuse the pnr pointer
        for i := 1 to count do
        begin
          if (pnr.dwDisplayType =
               RESOURCEDISPLAYTYPE_DOMAIN or
               RESOURCEDISPLAYTYPE_SERVER) and
            (pnr.dwType = RESOURCETYPE_DISK) then
              strings.Add(pnr.lpRemoteName);
          //recursive function call...
          if (pnr.dwUsage and RESOURCEUSAGE_CONTAINER) > 0 then
            EnumNetworkDrives(pnr);
          inc(longint(pnr),sizeof(TNetResource));
        end;
      end;
    finally
      FreeMem(buffer);
      WNetCloseEnum(hEnum);
    end;
  end;
begin
  if strings = nil then exit;
  //simply call the nested recursive function
  //passing nil to starting at the network root ...
  EnumNetworkDrives(nil);                                      // non
bisogna passare nil, ma un'altra cosa per personalizzare la "scansione"
end;

       RESOURCETYPE_DISK, 0, pnr, hEnum) = ERROR_SUCCESS then
tratto dalla guida sdk di winsozz:
typedef struct _NETRESOURCE {  // nr
     DWORD  dwScope;
     DWORD  dwType;
     DWORD  dwDisplayType;
     DWORD  dwUsage;
     LPTSTR lpLocalName;
     LPTSTR lpRemoteName;
     LPTSTR lpComment;
     LPTSTR lpProvider;
     ^^^^^^^^^^^^^^^^^^
} NETRESOURCE;
[cut]
lpProvider
Points to the name of the
provider owning this resource.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This member can be NULL if the provider name is unknown.
-- 
Alberto Salvati
A NEAPOLITAN Delphi Developer who is studying c# and .net
"Dicette 'o pappece 'nfaccia 'a noce dammi 'o tiempo che pure te spertoso"