Condividi tramite


Recupero di informazioni su una risorsa di rete

Per identificare il provider di rete proprietario di una risorsa, un'applicazione può chiamare la funzione WNetGetResourceInformation , come illustrato nell'esempio di codice seguente.

L'esempio seguente è una funzione (CheckServer) che accetta un nome di server come parametro e restituisce informazioni su tale server. Prima di tutto, la funzione chiama la funzione ZeroMemory per inizializzare il contenuto di un blocco di memoria su zero. L'esempio chiama quindi la funzione WNetGetResourceInformation , specificando un buffer sufficientemente grande da contenere solo una struttura NETRESOURCE . La routine include l'elaborazione degli errori per gestire il caso quando un buffer di questa dimensione non è sufficiente per contenere le stringhe a lunghezza variabile a cui i membri del punto di struttura NETRESOURCE . Se si verifica questo errore, l'esempio alloca memoria sufficiente e chiama nuovamente WNetGetResourceInformation . Infine, l'esempio libera la memoria allocata.

Si noti che l'esempio presuppone che il parametro pszServer punti a un nome server riconosciuto da uno dei provider di rete nel computer locale.

#include <Windows.h>
#include <Winnetwk.h >

// Need to link with Mpr.lib
#pragma comment(lib, "Mpr.lib")
//
// Verify a server on the network. 
//
DWORD
CheckServer( LPTSTR pszServer )
{  
    DWORD dwBufferSize = sizeof(NETRESOURCE);
    LPBYTE lpBuffer;                  // buffer
    NETRESOURCE nr;
    LPTSTR pszSystem = NULL;          // variable-length strings

    //
    // Set the block of memory to zero; then initialize
    // the NETRESOURCE structure. 
    //
    ZeroMemory(&nr, sizeof(nr));

    nr.dwScope       = RESOURCE_GLOBALNET;
    nr.dwType        = RESOURCETYPE_ANY;
    nr.lpRemoteName  = pszServer;

    //
    // First call the WNetGetResourceInformation function with 
    // memory allocated to hold only a NETRESOURCE structure. This 
    // method can succeed if all the NETRESOURCE pointers are NULL.
    // If the call fails because the buffer is too small, allocate
    // a larger buffer.
    //
    lpBuffer = (LPBYTE) malloc( dwBufferSize );
    if (lpBuffer == NULL) 
        return FALSE;

    while ( WNetGetResourceInformation(&nr, lpBuffer, &dwBufferSize, 
                &pszSystem) == ERROR_MORE_DATA)
    {
        lpBuffer = (LPBYTE) realloc(lpBuffer, dwBufferSize);
    }

    // Process the contents of the NETRESOURCE structure and the
    // variable-length strings in lpBuffer and set dwValue. When
    // finished, free the memory.

    free(lpBuffer);

    return TRUE;
}