Función WSAEnumNameSpaceProvidersA (winsock2.h)

La función WSAEnumNameSpaceProviders recupera información sobre los proveedores de espacios de nombres disponibles.

Sintaxis

INT WSAAPI WSAEnumNameSpaceProvidersA(
  [in, out] LPDWORD              lpdwBufferLength,
  [out]     LPWSANAMESPACE_INFOA lpnspBuffer
);

Parámetros

[in, out] lpdwBufferLength

En la entrada, el número de bytes contenidos en el búfer al que apunta lpnspBuffer. En la salida (si se produce un error en la función y el error es WSAEFAULT), el número mínimo de bytes que se pasarán para que lpnspBuffer recupere toda la información solicitada. El búfer pasado a WSAEnumNameSpaceProviders debe ser suficiente para contener toda la información del espacio de nombres.

[out] lpnspBuffer

Búfer que se rellena con estructuras WSANAMESPACE_INFO . Las estructuras devueltas se encuentran consecutivamente en el encabezado del búfer. Información de tamaño variable a la que hacen referencia los punteros de las estructuras apunta a ubicaciones dentro del búfer ubicado entre el final de las estructuras de tamaño fijo y el final del búfer. El número de estructuras rellenadas es el valor devuelto de WSAEnumNameSpaceProviders.

Valor devuelto

La función WSAEnumNameSpaceProviders devuelve el número de WSANAMESPACE_INFO estructuras copiadas en lpnspBuffer. De lo contrario, se devuelve el valor SOCKET_ERROR y se puede recuperar un número de error específico mediante una llamada a WSAGetLastError.

Código de error Significado
WSAEFAULT
El parámetro lpnspBuffer era un puntero NULL o la longitud del búfer, lpdwBufferLength, era demasiado pequeña para recibir todas las estructuras WSANAMESPACE_INFO pertinentes e información asociada. Cuando se devuelve este error, se devuelve la longitud del búfer necesaria en el parámetro lpdwBufferLength .
WSANOTINITIALISED
No se ha inicializado el WS2_32.DLL. La aplicación debe llamar primero a WSAStartup antes de llamar a cualquier función de Windows Sockets.
WSA_NOT_ENOUGH_MEMORY
No había memoria suficiente para realizar la operación.

Comentarios

La función WSAEnumNameSpaceProviders devuelve información sobre los proveedores de espacios de nombres disponibles en el búfer al que apunta el parámetro lpnspBuffer . El búfer devuelto contiene una matriz de estructuras de WSANAMESPACE_INFO ubicadas consecutivamente en el encabezado del búfer. Información de tamaño variable a la que hacen referencia los punteros de las estructuras de WSANAMESPACE_INFO apuntan a ubicaciones dentro del búfer ubicado entre el final de las estructuras de WSANAMESPACE_INFO fijas y el final del búfer. Devuelve el número de estructuras de WSANAMESPACE_INFO rellenadas.
Función WSAEnumNameSpaceProviders .

Cada entrada de estructura WSANAMESPACE_INFO contiene la información específica del proveedor sobre la entrada de espacio de nombres que se pasa a las funciones WSCInstallNameSpace y WSCInstallNameSpace32 cuando se instaló el proveedor de espacios de nombres.

La función WSAEnumNameSpaceProvidersEx es una versión mejorada de la función WSAEnumNameSpaceProviders . La función WSCEnumNameSpaceProvidersEx32 es una versión mejorada de la función WSAEnumNameSpaceProviders que devuelve información sobre los proveedores de espacios de nombres de 32 bits disponibles para su uso en plataformas de 64 bits.

Código de ejemplo

En el ejemplo siguiente se muestra el uso de la función WSAEnumNameSpaceProviders para recuperar información sobre los proveedores de espacios de nombres disponibles.
#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: la función WSAEnumNameSpaceProvidersW es compatible con Windows Phone aplicaciones de la Tienda en Windows Phone 8 y versiones posteriores.

Windows 8.1 y Windows Server 2012 R2: La función WSAEnumNameSpaceProvidersW es compatible con las aplicaciones de la Tienda Windows en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.

Nota

El encabezado winsock2.h define WSAEnumNameSpaceProviders como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Convenciones para prototipos de función.

Requisitos

   
Cliente mínimo compatible Windows 8.1, Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado winsock2.h
Library Ws2_32.lib
Archivo DLL Ws2_32.dll

Consulte también

WSAEnumNameSpaceProvidersEx

WSAGetLastError

WSANAMESPACE_INFO

WSAStartup

WSCEnumNameSpaceProvidersEx32

WSCInstallNameSpace

WSCInstallNameSpaceEx

Funciones winsock

Referencia de Winsock