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