Compartilhar via


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 conter todas as informações do namespace.

[out] lpnspBuffer

Um buffer preenchido com estruturas de WSANAMESPACE_INFO. As estruturas retornadas estão localizadas consecutivamente na cabeça do buffer. 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.

Valor de retorno

A função WSAEnumNameSpaceProviders retorna o número de estruturas de 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 de erro Significado
WSAEFAULT
O parâmetro lpnspBuffer era um ponteiro de 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 as funções do Windows Sockets.
WSA_NOT_ENOUGH_MEMORY
Não havia memória suficiente para executar a operação.

Observações

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 de WSANAMESPACE_INFO localizadas consecutivamente na cabeça do buffer. Informações de tamanho variável referenciadas por ponteiros nas estruturas de 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 estruturas de WSANAMESPACE_INFO preenchidas é retornado pelo
função WSAEnumNameSpaceProviders.

Cada entrada de estrutura WSANAMESPACE_INFO contém as informações específicas do provedor sobre a entrada do namespace passada para o WSCInstallNameSpace e funções de 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 posteriores.

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

Nota

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 do pré-processador UNICODE. A combinação do uso do alias neutro de codificação com código que não é neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Conventions for Function Prototypes.

Requisitos

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

Consulte também

WSAEnumNameSpaceProvidersEx

WSAGetLastError

WSANAMESPACE_INFO

WSAStartup

WSCEnumNameSpaceProvidersEx32

WSCInstallNameSpace

WSCInstallNameSpaceEx

do Winsock Functions

referência Winsock