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

Итак, в самом верху сети у нас находятся клиенты для сетей. Именно они поставляют сетевые ресурсы. Подробнее про них Вы можете почитать в разделе 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;
}
}
 
« Предыдущая статья   Следующая статья »