Поделиться через


Получение сведений о сетевом ресурсе

Чтобы определить поставщика сети, которому принадлежит ресурс, приложение может вызвать функцию WNetGetResourceInformation , как показано в следующем примере кода.

Следующий пример — это функция (CheckServer), которая принимает имя сервера в качестве параметра и возвращает сведения об этом сервере. Сначала функция вызывает функцию ZeroMemory , чтобы инициализировать содержимое блока памяти до нуля. Затем в примере вызывается функция WNetGetResourceInformation , указывающая достаточно большой буфер, чтобы содержать только структуру NETRESOURCE . Подпрограмма включает обработку ошибок для обработки случая, когда буфер этого размера недостаточно для хранения строк переменной длины, к которым относятся члены точки структуры NETRESOURCE . При возникновении этой ошибки пример выделяет достаточную память и снова вызывает WNetGetResourceInformation . Наконец, пример освобождает выделенную память.

Обратите внимание, что в примере предполагается, что параметр pszServer указывает на имя сервера, распознаваемое одним из поставщиков сети на локальном компьютере.

#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;
}