Функция 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 возвращает количество структур WSANAMESPACE_INFO, скопированных в lpnspBuffer. В противном случае возвращается значение SOCKET_ERROR, а определенный номер ошибки можно получить путем вызова WSAGetLastError.
Код ошибки | Значение |
---|---|
Параметр lpnspBuffer был указателем null или длиной буфера, lpdwBufferLength, был слишком мал, чтобы получить все соответствующие WSANAMESPACE_INFO структуры и связанные сведения. При возврате этой ошибки требуется длина буфера в параметре lpdwBufferLength. | |
WS2_32.DLL не инициализирована. Приложение должно сначала вызвать WSAStartup перед вызовом функций сокетов Windows. | |
Для выполнения операции недостаточно памяти. |
Замечания
Функция WSAEnumNameSpaceProviders возвращает сведения о доступных поставщиках пространств имен в буфере, на который указывает параметр lpnspBuffer. Возвращаемый буфер содержит массив структур WSANAMESPACE_INFO, расположенных последовательно в верхней части буфера. Сведения о размерах переменных, на которые ссылаются указатели в структурах WSANAMESPACE_INFO, указывают на расположения в буфере, расположенные между концами фиксированных WSANAMESPACE_INFO структур и конца буфера. Количество WSANAMESPACE_INFO структур, заполненных, возвращается
функцию WSAEnumNameSpaceProviders.
Каждая запись структуры WSANAMESPACE_INFO содержит сведения о пространстве имен, передаваемые в WSCInstallNameSpace и функции WSCInstallNameSpace32 при установке поставщика пространств имен.
Функция WSAEnumNameSpaceProvidersEx является расширенной версией функции WSAEnumNameSpaceProviders. Функция WSCEnumNameSpaceProvidersEx32 — это расширенная версия функции WSAEnumNameSpaceProviders, которая возвращает сведения о доступных 32-разрядных поставщиках пространств имен для использования на 64-разрядных платформах.
пример кода
В следующем примере показано использование функции 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: функция WSAEnumNameSpaceProvidersW поддерживается для приложений Магазина Windows Phone в Windows Phone 8 и более поздних версий.
Windows 8.1 и Windows Server 2012 R2: функция WSAEnumNameSpaceProviders W поддерживается для приложений Магазина Windows 8.1, Windows Server 2012 R2 и более поздних версий.
Заметка
Заголовок winsock2.h определяет WSAEnumNameSpaceProviders как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 8.1, Windows Vista [классические приложения | Приложения UWP] |
минимальный поддерживаемый сервер | Windows Server 2003 [классические приложения | Приложения UWP] |
целевая платформа | Виндоус |
заголовка | winsock2.h |
библиотеки |
Ws2_32.lib |
DLL | Ws2_32.dll |
См. также
Справочник