Récupération d’informations sur une ressource réseau
Pour identifier le fournisseur réseau propriétaire d’une ressource, une application peut appeler la fonction WNetGetResourceInformation , comme illustré dans l’exemple de code suivant.
L’exemple suivant est une fonction (CheckServer) qui prend un nom de serveur comme paramètre et retourne des informations sur ce serveur. Tout d’abord, la fonction appelle la fonction ZeroMemory pour initialiser le contenu d’un bloc de mémoire à zéro. Ensuite, l’exemple appelle la fonction WNetGetResourceInformation , en spécifiant une mémoire tampon suffisamment grande pour contenir uniquement une structure NETRESOURCE . La routine inclut le traitement des erreurs pour gérer le cas lorsqu’une mémoire tampon de cette taille est insuffisante pour contenir les chaînes de longueur variable sur lesquelles les membres de la structure NETRESOURCE pointent. Si cette erreur se produit, l’exemple alloue suffisamment de mémoire et appelle à nouveau WNetGetResourceInformation . Enfin, l’exemple libère la mémoire allouée.
Notez que l’exemple part du principe que le paramètre pszServer pointe vers un nom de serveur reconnu par l’un des fournisseurs réseau sur l’ordinateur local.
#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;
}