Перечисления (одноранговая инфраструктура)
С помощью перечислений можно получить список всех определенных одноранговых сущностей, которые соответствуют вашим критериям.
Получение перечисления и получение результатов
Получите дескриптор перечисления. Вызовите функцию PeerEnum, например вызовите функцию PeerGraphEnumRecords однорангового графинга. Функции PeerEnum создают перечисление и возвращают дескриптор для этого перечисления вызывающему приложению. Этот дескриптор должен использоваться для получения результатов.
При необходимости получите количество сущностей в перечислении. Вызовите функцию GetItemCount, например вызов PeerGraphGetItemCount или PeerGetItemCount.
Заметка
Значение, возвраща емое функцией GetItemCount, можно использовать для определения количества элементов, доступных для извлечения.
Получение группы результатов. Вызовите функцию GetNextItem, например вызов PeerGraphGetNextItem.
Заметка
Когда приложение вызывает функцию GetNextItem, указывает количество возвращаемых сущностей, а затем функция возвращает указатель на массив указателей на сущности, а также количество сущностей, которое всегда меньше или равно указанному числу. Приложению может потребоваться вызывать эту функцию много раз, пока число возвращаемых сущностей не меньше запрошенного числа.
После того как данные не нужны, освободит указатель на данные. Вызов функции FreeData, например вызов PeerGraphFreeData или PeerFreeData.
Заметка
Дополнительные сведения см. в разделе Освобождение одноранговых данных.
После того как приложению не нужен дескриптор перечисления, отпустите его. Вызов функции EndEnumeration, например вызов PeerEndEnumeration или PeerGraphEndEnumeration.
Пример перечисления
В следующем фрагменте кода показано, как перечислить доступные удостоверения.
#include <p2p.h>
#include <stdio.h>
#pragma comment(lib, "p2p.lib")
//-----------------------------------------------------------------------------
// Function: EnumIdentities
//
// Purpose: Demonstrate how to enumerate identities.
//
// Returns: HRESULT
//
HRESULT EnumIdentities(void)
{
HPEERENUM hPeerEnum = NULL;
HRESULT hr = PeerEnumIdentities(&hPeerEnum);
if (SUCCEEDED(hr))
{
ULONG cIdentities = 0;
hr = PeerGetItemCount(hPeerEnum, &cIdentities);
if (SUCCEEDED(hr))
{
ULONG i;
for (i = 0; i < cIdentities; i++)
{
ULONG cItem = 1; // process one result at a time
PEER_NAME_PAIR ** ppNamePair = NULL; // pointer to an array of pointers
hr = PeerGetNextItem(hPeerEnum, &cItem, (PVOID**) &ppNamePair);
if (SUCCEEDED(hr) && (1 == cItem))
{
wprintf(L"%s [%s]\r\n", (*ppNamePair)->pwzFriendlyName, (*ppNamePair)->pwzPeerName);
PeerFreeData(ppNamePair);
}
}
}
PeerEndEnumeration(hPeerEnum);
}
return hr;
}