C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 46 - О функциях Enum / Win 32 API / Win32 API

Шаг 46 - О функциях Enum

Мы уже несколько раз сталкивались с функциями начинающимися с префикса Enum. Это в принципе отдельный класс функций. Где мы их встречали ??? К примеру в шаге "Шаг 14 - Перечисление сервисов NT EnumServicesStatus".

Встретим мы их еще ??? Точно, вот примеры EnumCalendarInfoEx, EnumChildProc, EnumClipboardFormats. И так далее.

Вообщем есть такой класс функций. Название этих функций идет от английского Enumeration, то есть перечисление. Используются они, если нужно получить доступ к списку чего-либо, например соединений, устройств и так далее. По этому поводу есть два пути. Первый передавать адрес массива и количество элементов в нем. Но тут нам нужно самим организовывать циклы доступа и так далее. Другой подход реализованный в этих функциях: можно вызывать одну и туже функцию, которая будет возвращать нам значения. Это скрывает от нас многие тонкости реализации. Общая идея такая.

Пока (EnumGet());

То есть получать значения пока они есть. Кроме того применение подобной технологии позволяет передать указатель на нашу функцию и тогда при перечислении будет вызываться наша функция, а в параметрах будут передаваться необходимые данные. Здесь идея другая:

EnumGet(*MyFunction)

Моя функция вызовется столько раз, сколько значений есть в списке, а уж мне решать, что с этим делать. В данном варианте мне вообще не нужно проверять все данные выбраны или нет. Сколько данных, столько раз она и вызовется. Вот каркас, который демонстрирует как это реализуется:

Вариант 1

// 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;
	}
}

Вариант 2

// 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;
}

Конечно эти примеры очень упрощенные, но главное показана идея как это вообще работает и как реализовывается.


| |
Автор Каев Артем.
[AD]