Мы уже несколько раз сталкивались с функциями начинающимися с префикса Enum. Это в принципе отдельный класс функций. Где мы их встречали ??? К примеру в шаге "Шаг 14 - Перечисление сервисов NT EnumServicesStatus".
Встретим мы их еще ??? Точно, вот примеры EnumCalendarInfoEx, EnumChildProc, EnumClipboardFormats. И так далее.
Вообщем есть такой класс функций. Название этих функций идет от английского Enumeration, то есть перечисление. Используются они, если нужно получить доступ к списку чего-либо, например соединений, устройств и так далее. По этому поводу есть два пути. Первый передавать адрес массива и количество элементов в нем. Но тут нам нужно самим организовывать циклы доступа и так далее. Другой подход реализованный в этих функциях: можно вызывать одну и туже функцию, которая будет возвращать нам значения. Это скрывает от нас многие тонкости реализации. Общая идея такая.
Пока (EnumGet());
То есть получать значения пока они есть. Кроме того применение подобной технологии позволяет передать указатель на нашу функцию и тогда при перечислении будет вызываться наша функция, а в параметрах будут передаваться необходимые данные. Здесь идея другая:
EnumGet(*MyFunction)
Моя функция вызовется столько раз, сколько значений есть в списке, а уж мне решать, что с этим делать. В данном варианте мне вообще не нужно проверять все данные выбраны или нет. Сколько данных, столько раз она и вызовется. Вот каркас, который демонстрирует как это реализуется:
// TestEnum.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream.h" bool EnumGet(); int x; void main() { x=0; cout << "test1" << endl; while(EnumGet()); cout << "test2" << endl; while(EnumGet()); } bool EnumGet() { x=x+1; if (x==3) { x=0; return false; } else { cout << "Iter - " << x << endl; return true; } }
// TestEnum.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream.h" void MyFunct(int x); void EnumGet(); void main() { cout << "test1" << endl; EnumGet(); cout << "test2" << endl; EnumGet(); } void EnumGet() { int x; x=3; for (int y=1; y<x ;y++) MyFunct(y); } void MyFunct(int x) { cout << "Iter - " << x << endl; }
Конечно эти примеры очень упрощенные, но главное показана идея как это вообще работает и как реализовывается.