Шаг 138 - Исследуем сеть - список клиентов

Итак, в самом верху сети у нас находятся клиенты для сетей. Именно они поставляют сетевые ресурсы. Подробнее про них Вы можете почитать в разделе Windows. Мы с Вами попробуем программно их получить. Для этого у нас есть функция WNetEnumResource():

DWORD WNetEnumResource
( 
	HANDLE hEnum,		// указатель на ресурсы
	LPDWORD lpcCount,		// сколько перечислят и результат перечисления
	LPVOID lpBuffer,		// указатель на буфер
	LPDWORD lpBufferSize	// размер буфера
);

Если в lpcCount указать -1, то будут перечисляться все возможные ресурсы. В буфер будут помещаться результаты. Размер нужно установить достаточный. Где-то читал, что 16 KB - это удачный выбор. При успешном выполнении может вернуть NO_ERROR или ERROR_NO_MORE_ITEMS, что значит нет вхождений. Функция получения списка клиентов будет выглядеть вот так:

void CEasyEnumProvider::GetResource()
{
	do 
	{
		dwResult = WNetEnumResource(hEnum,&cEntries,netRc,&cbBuffer);
		if( dwResult == NO_ERROR )
		{
			LPNETRESOURCE temp;
			temp=&netRc[0];
			cArray.Add(temp->lpProvider); 
		}
		else break;
	}while( dwResult != ERROR_NO_MORE_ITEMS );
}

Получаем ресурс и пока есть элементы dwResult != ERROR_NO_MORE_ITEMS берем имя провайдера и складываем в массив. Только сначала нужно инициализировать массив и переменные. Вот так:

CEasyEnumNetResourceAbstract ::CEasyEnumNetResourceAbstract ()
{
	cEntries = -1 ;		// для всех ресурсов
	cbBuffer = 16384;		// размер буфера
	netRc=0;
	netRc = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);
}

CEasyEnumNetResourceAbstract ::~CEasyEnumNetResourceAbstract ()
{
	GlobalFree((HGLOBAL)netRc);
}

CEasyEnumProvider я породил от CEasyEnumNetResourceAbstract, в котором там производится иницализация переменных открытие перечислителя и все такое. В CEasyEnumProvider всего одна функция GetResource. А вот так это используется:

#include "stdafx.h"
#include "iostream.h"
#include "EasyEnumNetResource.h"

void main()
{
	try
	{
		CEasyEnumProvider ce;
		ce.OpenEnum(); 
		int x=ce.GetCount();
		for (int i=0;i<x;i++) 
			cout << ce.GetString(i) << endl;  
	}
	catch(CString s)
	{
		cout << s;
	}
}

Полный пример кодов в проекте. В результате работы программы на экране будет список доступных клиентов на компьютере, с которого запущена эта программа.

138_1.gif (6427 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 20.08.2001