Função WSAEnumNameSpaceProvidersW (winsock2.h)

A função WSAEnumNameSpaceProviders recupera informações sobre provedores de namespace disponíveis.

Sintaxe

INT WSAAPI WSAEnumNameSpaceProvidersW(
  [in, out] LPDWORD              lpdwBufferLength,
  [out]     LPWSANAMESPACE_INFOW lpnspBuffer
);

Parâmetros

[in, out] lpdwBufferLength

Na entrada, o número de bytes contidos no buffer apontado por lpnspBuffer. Na saída (se a função falhar e o erro for WSAEFAULT), o número mínimo de bytes a serem passados para o lpnspBuffer recuperar todas as informações solicitadas. O buffer passado para WSAEnumNameSpaceProviders deve ser suficiente para manter todas as informações do namespace.

[out] lpnspBuffer

Um buffer preenchido com estruturas WSANAMESPACE_INFO . As estruturas retornadas estão localizadas consecutivamente no cabeçalho do buffer. As informações de tamanho variável referenciadas por ponteiros nas estruturas apontam para locais dentro do buffer localizado entre o final das estruturas de tamanho fixo e o final do buffer. O número de estruturas preenchidas é o valor retornado de WSAEnumNameSpaceProviders.

Retornar valor

A função WSAEnumNameSpaceProviders retorna o número de estruturas WSANAMESPACE_INFO copiadas para lpnspBuffer. Caso contrário, o valor SOCKET_ERROR será retornado e um número de erro específico poderá ser recuperado chamando WSAGetLastError.

Código do erro Significado
WSAEFAULT
O parâmetro lpnspBuffer era um ponteiro NULL ou o comprimento do buffer, lpdwBufferLength, era muito pequeno para receber todas as estruturas de WSANAMESPACE_INFO relevantes e informações associadas. Quando esse erro é retornado, o comprimento do buffer necessário é retornado no parâmetro lpdwBufferLength .
WSANOTINITIALISED
O WS2_32.DLL não foi inicializado. O aplicativo deve primeiro chamar WSAStartup antes de chamar qualquer função do Windows Sockets.
WSA_NOT_ENOUGH_MEMORY
Não havia memória suficiente para executar a operação.

Comentários

A função WSAEnumNameSpaceProviders retorna informações sobre provedores de namespace disponíveis no buffer apontado pelo parâmetro lpnspBuffer . O buffer retornado contém uma matriz de estruturas WSANAMESPACE_INFO localizadas consecutivamente na cabeça do buffer. As informações de tamanho variável referenciadas por ponteiros nas estruturas WSANAMESPACE_INFO apontam para locais dentro do buffer localizado entre o final das estruturas de WSANAMESPACE_INFO fixas e o final do buffer. O número de WSANAMESPACE_INFO estruturas preenchidas é retornado pelo
Função WSAEnumNameSpaceProviders .

Cada entrada de estrutura WSANAMESPACE_INFO contém as informações específicas do provedor sobre a entrada de namespace passada para as funções WSCInstallNameSpace e WSCInstallNameSpace32 quando o provedor de namespace foi instalado.

A função WSAEnumNameSpaceProvidersEx é uma versão aprimorada da função WSAEnumNameSpaceProviders . A função WSCEnumNameSpaceProvidersEx32 é uma versão aprimorada da função WSAEnumNameSpaceProviders que retorna informações sobre provedores de namespace de 32 bits disponíveis para uso em plataformas de 64 bits.

Código de exemplo

O exemplo a seguir demonstra o uso da função WSAEnumNameSpaceProviders para recuperar informações sobre provedores de namespace disponíveis.
#ifndef UNICODE
#define UNICODE 1
#endif

#include <winsock2.h>
#include <ws2tcpip.h>
#include <objbase.h>
#include <stdio.h>

// Link with ws2_32.lib and ole32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "ole32.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
// Note: could also use malloc() and free()

int wmain()
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;
    int iError = 0;

    INT iNuminfo = 0;

    int i;
    

    // Allocate a 4K buffer to retrieve all the namespace providers
    DWORD dwInitialBufferLen = 4096;
    DWORD dwBufferLen;
    LPWSANAMESPACE_INFO lpProviderInfo;
    
    
    // variables needed for converting provider GUID to a string
    int iRet = 0;
    WCHAR GuidString[40] = {0};

    // Set dwBufferLen to the initial buffer length
    dwBufferLen = dwInitialBufferLen;
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }
    
    lpProviderInfo = (LPWSANAMESPACE_INFO) MALLOC(dwBufferLen);
    if (lpProviderInfo == NULL) {
        wprintf(L"Memory allocation for providers buffer failed\n");
        WSACleanup();
        return 1;
    }
    
    iNuminfo = WSAEnumNameSpaceProviders(&dwBufferLen, lpProviderInfo);
    if (iNuminfo == SOCKET_ERROR) {
        iError = WSAGetLastError();
        if (iError == WSAEFAULT && dwBufferLen != dwInitialBufferLen) {
            wprintf(L"WSAEnumNameSpaceProviders failed with too small a buffer\n");
            wprintf(L"  Increasing the buffer to %u\n\n", dwBufferLen);
            if (lpProviderInfo) {
               FREE(lpProviderInfo);
               lpProviderInfo = NULL;
            }        

            lpProviderInfo = (LPWSANAMESPACE_INFO) MALLOC(dwBufferLen);
            if (lpProviderInfo == NULL) {
                wprintf(L"Memory allocation for providers buffer failed\n");
                WSACleanup();
               return 1;
            }

            iNuminfo = WSAEnumNameSpaceProviders(&dwBufferLen, lpProviderInfo);
            if (iNuminfo == SOCKET_ERROR) {
               wprintf(L"WSAEnumNameSpaceProviders failed with error: %d\n",
                  WSAGetLastError() );
               if (lpProviderInfo) {
                  FREE(lpProviderInfo);
                  lpProviderInfo = NULL;
               }        
               WSACleanup();
               return 1;
            }
            else
                wprintf(L"\n");   
        } 
        else {   
            wprintf(L"WSAEnumNameSpaceProviders failed with error: %d\n",
               WSAGetLastError() );
            if (lpProviderInfo) {
               FREE(lpProviderInfo);
               lpProviderInfo = NULL;
            }        
           WSACleanup();
           return 1;
        } 
     }

       wprintf(L"WSAEnumNameSpaceProviders succeeded with provider data count = %d\n\n",
           iNuminfo);
       for (i= 0; i < iNuminfo; i++) {
            iRet = StringFromGUID2(lpProviderInfo[i].NSProviderId, (LPOLESTR) &GuidString, 39); 
            if (iRet == 0)
                wprintf(L"StringFromGUID2 failed\n");
            else 
                wprintf(L"NameSpace ProviderId[%u] = %ws\n",i, GuidString);

           wprintf(L"NameSpace[%u] = ", i);
           switch (lpProviderInfo[i].dwNameSpace) {
           case NS_DNS:
               wprintf(L"Domain Name System (NS_DNS)\n");
               break;
           case NS_WINS:
               wprintf(L"Windows Internet Naming Service (NS_WINS)\n");
               break;
           case NS_NETBT:
               wprintf(L"NetBIOS (NS_NETBT)\n");
               break;
           case NS_NTDS:
               wprintf(L"Windows NT Directory Services (NS_NTDS)\n");
               break;
           case NS_NLA:
               wprintf(L"Network Location Awareness (NS_NLA)\n");
               break;
           // following values only defined on Vista and later
#if(_WIN32_WINNT >= 0x0600)
           case NS_BTH:
               wprintf(L"Bluetooth (NS_BTH)\n");
               break;
           case NS_EMAIL:
               wprintf(L"Email (NS_EMAIL)\n");
               break;
           case NS_PNRPNAME:
               wprintf(L"Peer-to-peer (NS_PNRPNAME)\n");
               break;
           case NS_PNRPCLOUD:
               wprintf(L"Peer-to-peer collection (NS_PNRPCLOUD)\n");
               break;
#endif
           default:
               wprintf(L"Other value (%u)\n", lpProviderInfo[i].dwNameSpace);             
               break;
           }    

           if (lpProviderInfo[i].fActive)
               wprintf(L"Namespace[%u] is active\n", i);
           else    
               wprintf(L"Namespace[%u] is inactive\n", i);

           wprintf(L"NameSpace Version[%u] = %u\n", i, lpProviderInfo[i].dwVersion);

           wprintf(L"Namespace Identifier[%u] = %ws\n\n", i, lpProviderInfo[i].lpszIdentifier);
       }           

    if (lpProviderInfo) {
        FREE(lpProviderInfo);
        lpProviderInfo = NULL;
    }        
    WSACleanup();
    
    return 0;
}

Windows Phone 8: a função WSAEnumNameSpaceProvidersW tem suporte para aplicativos da Windows Phone Store no Windows Phone 8 e posterior.

Windows 8.1 e Windows Server 2012 R2: a função WSAEnumNameSpaceProvidersW tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posterior.

Observação

O cabeçalho winsock2.h define WSAEnumNameSpaceProviders como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante de pré-processador UNICODE. Misturar o uso do alias neutro de codificação com código que não seja neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Convenções para protótipos de função.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 8.1, Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho winsock2.h
Biblioteca Ws2_32.lib
DLL Ws2_32.dll

Confira também

WSAEnumNameSpaceProvidersEx

Wsagetlasterror

WSANAMESPACE_INFO

Wsastartup

WSCEnumNameSpaceProvidersEx32

WSCInstallNameSpace

WSCInstallNameSpaceEx

Funções Winsock

Referência de Winsock