Borland C++ Builder VCL FAQ - Получение списка компьютеров в сети

ОГЛАВЛЕНИЕ


Получение списка компьютеров в сети

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 );
}