Bagikan melalui


Fungsi WSAEnumNameSpaceProvidersA (winsock2.h)

Fungsi WSAEnumNameSpaceProviders mengambil informasi tentang penyedia namespace yang tersedia.

Sintaks

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

Parameter

[in, out] lpdwBufferLength

Pada input, jumlah byte yang terkandung dalam buffer yang diacu oleh lpnspBuffer. Pada output (jika fungsi gagal, dan kesalahannya adalah WSAEFAULT), jumlah minimum byte yang akan diteruskan untuk lpnspBuffer untuk mengambil semua informasi yang diminta. Buffer yang diteruskan ke WSAEnumNameSpaceProviders harus cukup untuk menyimpan semua informasi namespace.

[out] lpnspBuffer

Buffer yang diisi dengan struktur WSANAMESPACE_INFO . Struktur yang dikembalikan terletak berturut-turut di kepala buffer. Informasi berukuran variabel yang direferensikan oleh pointer dalam struktur menunjuk ke lokasi dalam buffer yang terletak di antara akhir struktur berukuran tetap dan akhir buffer. Jumlah struktur yang diisi adalah nilai pengembalian WSAEnumNameSpaceProviders.

Nilai kembali

Fungsi WSAEnumNameSpaceProviders mengembalikan jumlah struktur WSANAMESPACE_INFO yang disalin ke dalam lpnspBuffer. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan nomor kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.

Kode kesalahan Makna
WSAEFAULT
Parameter lpnspBuffer adalah pointerNULL atau panjang buffer, lpdwBufferLength, terlalu kecil untuk menerima semua struktur WSANAMESPACE_INFO yang relevan dan informasi terkait. Ketika kesalahan ini dikembalikan, panjang buffer yang diperlukan dikembalikan dalam parameter lpdwBufferLength .
WSANOTINITIALISED
WS2_32.DLL belum diinisialisasi. Aplikasi harus terlebih dahulu memanggil WSAStartup sebelum memanggil fungsi Windows Sockets apa pun.
WSA_NOT_ENOUGH_MEMORY
Memori tidak cukup untuk melakukan operasi.

Keterangan

Fungsi WSAEnumNameSpaceProviders mengembalikan informasi tentang penyedia namespace yang tersedia di buffer yang diacu oleh parameter lpnspBuffer . Buffer yang dikembalikan berisi array struktur WSANAMESPACE_INFO yang terletak berturut-turut di kepala buffer. Informasi berukuran variabel yang direferensikan oleh pointer dalam struktur WSANAMESPACE_INFO menunjuk ke lokasi dalam buffer yang terletak di antara akhir struktur WSANAMESPACE_INFO tetap dan akhir buffer. Jumlah struktur WSANAMESPACE_INFO yang diisi dikembalikan oleh
Fungsi WSAEnumNameSpaceProviders .

Setiap entri struktur WSANAMESPACE_INFO berisi informasi khusus penyedia pada entri namespace yang diteruskan ke fungsi WSCInstallNameSpace dan WSCInstallNameSpace32 saat penyedia namespace diinstal.

Fungsi WSAEnumNameSpaceProvidersEx adalah versi yang disempurnakan dari fungsi WSAEnumNameSpaceProviders . Fungsi WSCEnumNameSpaceProvidersEx32 adalah versi yang disempurnakan dari fungsi WSAEnumNameSpaceProviders yang mengembalikan informasi tentang penyedia namespace 32-bit yang tersedia untuk digunakan pada platform 64-bit.

Contoh Kode

Contoh berikut menunjukkan penggunaan fungsi WSAEnumNameSpaceProviders untuk mengambil informasi tentang penyedia namespace yang tersedia.
#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: Fungsi WSAEnumNameSpaceProvidersW didukung untuk aplikasi Windows Phone Store di Windows Phone 8 dan yang lebih baru.

Windows 8.1 dan Windows Server 2012 R2: Fungsi WSAEnumNameSpaceProvidersW didukung untuk aplikasi Windows Store di Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.

Catatan

Header winsock2.h mendefinisikan WSAEnumNameSpaceProviders sebagai alias yang secara otomatis memilih versi ANSI atau Unicode dari fungsi ini berdasarkan definisi konstanta pra-prosesor UNICODE. Mencampur penggunaan alias encoding-netral dengan kode yang tidak mengodekan-netral dapat menyebabkan ketidakcocokan yang mengakibatkan kesalahan kompilasi atau runtime. Untuk informasi selengkapnya, lihat Konvensi untuk Prototipe Fungsi.

Persyaratan

   
Klien minimum yang didukung Windows 8.1, Windows Vista [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header winsock2.h
Pustaka Ws2_32.lib
DLL Ws2_32.dll

Lihat juga

WSAEnumNameSpaceProvidersEx

WSAGetLastError

WSANAMESPACE_INFO

Mulai WSA

WSCEnumNameSpaceProvidersEx32

WSCInstallNameSpace

WSCInstallNameSpaceEx

Fungsi Winsock

Referensi Winsock