WSAEnumNameSpaceProvidersA 函式 (winsock2.h)

WSAEnumNameSpaceProviders 函式會擷取可用命名空間提供者的相關資訊。

語法

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

參數

[in, out] lpdwBufferLength

在輸入時, lpnspBuffer所指向緩衝區中包含的位元組數目。 在輸出 (如果函式失敗,而且錯誤為 WSAEFAULT) ,則為 lpnspBuffer 要傳遞的最小位元組數,以擷取所有要求的資訊。 傳遞至 WSAEnumNameSpaceProviders 的緩衝區必須足以保存所有命名空間資訊。

[out] lpnspBuffer

填入 WSANAMESPACE_INFO 結構的緩衝區。 傳回的結構會連續位於緩衝區的前端。 結構中的指標所參考的可變大小資訊會指向位於固定大小結構結尾與緩衝區結尾之間緩衝區內的位置。 填入的結構數目是 WSAEnumNameSpaceProviders的傳回值。

傳回值

WSAEnumNameSpaceProviders函式會傳回復制到lpnspBuffer的WSANAMESPACE_INFO結構數目。 否則,會傳回SOCKET_ERROR值,並呼叫 WSAGetLastError來擷取特定的錯誤號碼。

錯誤碼 意義
WSAEFAULT
lpnspBuffer參數是Null指標或緩衝區長度lpdwBufferLength太小,無法接收所有相關WSANAMESPACE_INFO結構和相關資訊。 傳回此錯誤時, lpdwBufferLength 參數中會傳回所需的緩衝區長度。
WSANOTINITIALISED
尚未初始化 WS2_32.DLL。 應用程式必須先呼叫 WSAStartup ,再呼叫任何 Windows Sockets 函式。
WSA_NOT_ENOUGH_MEMORY
記憶體不足,無法執行作業。

備註

WSAEnumNameSpaceProviders函式會傳回lpnspBuffer參數所指向之緩衝區中可用命名空間提供者的相關資訊。 傳回的緩衝區包含連續位於緩衝區前端 WSANAMESPACE_INFO 結構的陣列。 WSANAMESPACE_INFO結構中的指標所參考的可變大小資訊會指向位於固定WSANAMESPACE_INFO結構和緩衝區結尾之間緩衝區內的位置。 填入 的WSANAMESPACE_INFO 結構數目會由 傳回
WSAEnumNameSpaceProviders 函 式。

每個 WSANAMESPACE_INFO 結構專案都包含在安裝命名空間提供者時傳遞至 WSCInstallNameSpaceWSCInstallNameSpace32 函式之命名空間專案上的提供者特定資訊。

WSAEnumNameSpaceProvidersEx 函式是WSAEnumNameSpaceProviders 函式的增強版本。 WSCEnumNameSpaceProvidersEx32函式是WSAEnumNameSpaceProviders函式的增強版本,會傳回 64 位平臺上可用 32 位命名空間提供者的相關資訊。

範例程式碼

下列範例示範如何使用 WSAEnumNameSpaceProviders 函 式來擷取可用命名空間提供者的相關資訊。
#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:Windows Phone 8 和更新版本上的 Windows Phone Store 應用程式支援WSAEnumNameSpaceProvidersW函式。

Windows 8.1Windows Server 2012 R2:Windows 市集應用程式在 Windows 8.1、Windows Server 2012 R2 及更新版本上支援WSAEnumNameSpaceProvidersW函式。

注意

winsock2.h 標頭會根據 UNICODE 預處理器常數的定義,將 WSAEnumNameSpaceProviders 定義為別名,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例

規格需求

   
最低支援的用戶端 Windows 8.1、Windows Vista [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 winsock2.h
程式庫 Ws2_32.lib
Dll Ws2_32.dll

另請參閱

WSAEnumNameSpaceProvidersEx

WSAGetLastError

WSANAMESPACE_INFO

WSAStartup

WSCEnumNameSpaceProvidersEx32

WSCInstallNameSpace

WSCInstallNameSpaceEx

Winsock 函式

Winsock 參考