//---------------------------------------------------------------------------
#include
#include
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Gauges"
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------
String GetIP(char *name)
{
AnsiString ip;
struct in_addr *addr;
WORD wVersionRequested;
WSADATA wsaData;
if (name[strlen(name)-1] == '\n')
name[strlen(name)-1] = '\0';
int err;
wVersionRequested = MAKEWORD(2, 0);
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return "Не найден WinSock DLL.";
}
PHOSTENT h = gethostbyname(name);
if (!h)
{
switch (WSAGetLastError())
{
case WSAENETDOWN:
return "Сбой в сети";
case WSAEINPROGRESS:
return "Выполняется блокирующая функция интерфейса Windows Sockets";
case WSAEAFNOSUPPORT:
return "Этот протокол не может работать с указанным семейством адресов";
case WSAENOBUFS:
return "Установлено слишком много соединений";
}
return "Error";
}
addr = (struct in_addr h->h_addr_list[0];
ip = IntToStr(addr->S_un.S_un_b.s_b1) + ".";
ip += IntToStr(addr->S_un.S_un_b.s_b2) + ".";
ip += IntToStr(addr->S_un.S_un_b.s_b3) + ".";
ip += IntToStr(addr->S_un.S_un_b.s_b4);
return ip;
}
//-------------------------------------------------------------------------------
void EnumComputers(int Level, LPNETRESOURCE lpNet)
{
String ip;
DWORD dwStatus, dwSize, dwEntries, i, j;
LPNETRESOURCE lpNewNet = NULL;
HANDLE hEnum = NULL;
dwStatus = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, lpNet, &hEnum);
if (dwStatus == NO_ERROR)
{
dwEntries = 1000;
dwSize = sizeof(NETRESOURCE) * dwEntries;
lpNewNet = (LPNETRESOURCE)new char[dwSize];
if (lpNewNet)
{
dwStatus = WNetEnumResource( hEnum, &dwEntries, (LPVOID)lpNewNet, &dwSize );
if( dwStatus == NO_ERROR )
{
WNetCloseEnum( hEnum );
hEnum = NULL;
for (i = 0; i < dwEntries; i++)
{
if (lpNewNet[ i ].lpRemoteName)
{
if (lpNewNet.dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
{
Form2->ComputerList->Items->Add(lpNewNet.lpRemoteName);
}
//IP адрес к концу строки
if (lpNewNet.dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
ip = GetIP((char*)&lpNewNet.lpRemoteName[2]);
}
if (Level < 2) //0=Сеть, 1=Domain,2=Host,3=Resource
EnumComputers(Level + 1, lpNewNet + i);
}
}
}
}
if (hEnum) WNetCloseEnum(hEnum);
if (lpNewNet) delete lpNewNet;
}
//---------------------------------------------------------------------------