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