Функция 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 Sockets. | |
Недостаточно памяти для выполнения операции. |
Комментарии
Функция 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: функция WSAEnumNameSpaceProvidersW поддерживается для приложений Магазина Windows на Windows 8.1, Windows Server 2012 R2 и более поздних версий.
Примечание
Заголовок winsock2.h определяет WSAEnumNameSpaceProviders в качестве псевдонима, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОД. Использование псевдонима, не зависящий от кодирования, с кодом, который не является нейтральным для кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или времени выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.
Требования
Минимальная версия клиента | Windows 8.1, Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | winsock2.h |
Библиотека | Ws2_32.lib |
DLL | Ws2_32.dll |