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 en tant que 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 comprend la gestion des erreurs pour gérer le cas où une mémoire tampon de cette taille est insuffisante pour contenir les chaînes de longueur variable auxquelles les membres de la structure NETRESOURCE pointent. Si cette erreur se produit, l’exemple alloue suffisamment de mémoire et appelle WNetGetResourceInformation à nouveau. Enfin, l'échantillon libère la mémoire allouée.
Notez que l’exemple suppose que le paramètre pszServer pointe vers un nom de serveur que l’un des fournisseurs de réseau sur l’ordinateur local reconnaît.
#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;
}