Borland C++ Builder VCL FAQ - Получение списка компьютеров в сети
ОГЛАВЛЕНИЕ
Страница 70 из 96
Получение списка компьютеров в сети
BOOL EnumHandler( HWND hWnd, DWORD dwLevel, LPNETRESOURCE lpNet )
{
BOOL ret=TRUE;
DWORD dwStatus, dwSize, dwEntries, i, j;
LPSTR lpStr=NULL;
LPNETRESOURCE lpNewNet=NULL;
HANDLE hEnum=NULL;
dwStatus = WNetOpenEnum( RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
0, lpNet, &hEnum );
if( dwStatus != NO_ERROR ){ ret=FALSE; goto mend; }
dwEntries = 1000;
dwSize = sizeof(NETRESOURCE) * dwEntries;
lpNewNet=(LPNETRESOURCE)new char[dwSize];
if(!lpNewNet){ ret=FALSE; goto mend; }
dwStatus = WNetEnumResource( hEnum, &dwEntries, (LPVOID)lpNewNet, &dwSize );
if( dwStatus != NO_ERROR )
{
ret=FALSE; goto mend;
}
WNetCloseEnum( hEnum );
hEnum=NULL;
lpStr=new char[512];
if(!lpStr){ ret=FALSE; goto mend; }
for( i = 0; i < dwEntries; i++ )
{
if( lpNewNet[ i ].dwDisplayType==RESOURCEDISPLAYTYPE_NETWORK)
{
strcpy( lpStr, lpNewNet[ i ].lpProvider );
}
if( lpNewNet[ i ].lpRemoteName )
{
if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_DOMAIN )
strcpy( lpStr, "Domain..." );
if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_GENERIC )
strcpy( lpStr, "Generic.." );
if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER )
strcpy( lpStr, "Server..." );
if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_SHARE )
strcpy( lpStr, "Share...." );
for( j = 0; j < dwLevel; j++ )
strcat( lpStr, "......" );
strcat( lpStr, lpNewNet[ i ].lpRemoteName );
//Добавим IP адрес к концу строки
// if( lpNewNet[ i ].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER )
// if(!GetIP(&lpNewNet[ i ].lpRemoteName[2],lpStr))continue;
}
SendMessage( hWnd, LB_ADDSTRING, 0,(LPARAM)lpStr );
UpdateWindow(hWnd);
// Уровень детализации вы сможете установить здесь
if(dwLevel < 2) //0=Сеть,1=Domain,2=Host,3=Resource
EnumHandler( hWnd, dwLevel + 1, lpNewNet + i );
}
mend:
if(hEnum)WNetCloseEnum( hEnum );
if(lpStr)delete lpStr;
if(lpNewNet)delete lpNewNet;
return ret;
}
//-------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HCURSOR hOldCursor;
// ListBox1->Clear();
SendMessage(Form1->ListBox1->Handle , LB_RESETCONTENT, 0, 0 );
UpdateWindow(Form1->ListBox1->Handle);
hOldCursor = ::SetCursor( LoadCursor( NULL, IDC_WAIT ) );
EnumHandler( Form1->ListBox1->Handle, 0, NULL );
::SetCursor( hOldCursor );
}