jak wyświetlić nazwy dostępnych komputerów w LAN

0

Czy ktoś wie może jak w Builderze wyświetlić listę dostępnych komputerów w lokalnej sieci? A potem ewentualnie nawet wejść na takiego kompa w sieci?

0

Ja wiem:)... Funkcja poniższa wyświetla listę komputerów, tych które możemy zobaczyć przez Otocznie Sieciowe. Program najpierw robi 'listing' zasobów sieciowych, a następnie wywala z tego to, co nie jest nazwą komputera... Mogłoby to być o wiele szybsze, ale pisałem to kiedyś dla siebie i nie widziałem sensu przyspieszania tego kodu:

//FUNKCJA ROBIĄCA LISTING UDOSTĘPNIEŃ:
void __fastcall TConnect::EnumNetRes(NETRESOURCE* nr)
{ 
HANDLE hEnum; 
if(WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER|RESOURCEUSAGE_CONNECTABLE, nr, &hEnum) != NO_ERROR) 
{ 
// błąd - dostęp wzbroniony 
return;
} 
DWORD Count=-1; 
DWORD BufferSize=0; 
DWORD ReturnVal=0; 

NETRESOURCE *NetRes=(NETRESOURCE*)new char[1024]; 
ZeroMemory(NetRes,sizeof(NETRESOURCE)); 
for(;;) 
{ 
ReturnVal=WNetEnumResource(hEnum,&Count,NetRes,&BufferSize); 
if(ReturnVal==ERROR_MORE_DATA) 
{ 
Count=-1; 
delete[] NetRes; 
NetRes=(NETRESOURCE*)new char[BufferSize]; 
ZeroMemory(NetRes,sizeof(NETRESOURCE)); 
ReturnVal=WNetEnumResource(hEnum,&Count,NetRes,&BufferSize); 
} 
if(ReturnVal!=NO_ERROR)break; 
for(unsigned int i=0;i<Count;i++) 
{ 
ListBox1->Items->Add(NetRes[i].lpRemoteName); 
if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER) 
EnumNetRes(&NetRes[i]); 
} 
if(ReturnVal == ERROR_NO_MORE_ITEMS) 
{ 
delete[] NetRes; 
WNetCloseEnum(hEnum); 
} 
} 
delete[] NetRes; 
WNetCloseEnum(hEnum); 
} 
//-----------------------------------------------------------


//FUNKCJA WYWOŁUJĄCA I WYWALAJĄCA Z LISTBOX`A WSZYSTKO CO NIE JEST NASWĄ KOMPUTERA:
void __fastcall TConnect::FormCreate(TObject *Sender)
{
EnumNetRes(NULL);

for(int i=0; i<ListBox1->Items->Count; i++)
        {
        Application->ProcessMessages();
        if(ListBox1->Items->Strings[i].SubString(1,2)=="\\\")
                {
                ListBox1->Items->Strings[i]=ListBox1->Items->Strings[i].SubString(3,ListBox1->Items->Strings[i].Length()-2);
                }
        else
                {
                ListBox1->Items->Delete(i);
                i--;
                }
        }


for(int i=0; i<ListBox1->Items->Count; i++)
        {
        bool s=0;
        for(int j=0; j<ListBox1->Items->Strings[i].Length(); j++)
                {
                if(ListBox1->Items->Strings[i].SubString(j,1)=="\"||ListBox1->Items->Strings[i].SubString(j,1)=="/")
                        {
                        ListBox1->Items->Strings[i]=ListBox1->Items->Strings[i].SubString(1,j-1);
                        }
                Application->ProcessMessages();
                }
        }


for(int i=0; i<ListBox1->Items->Count; i++)
for(int j=i+1; j<ListBox1->Items->Count; j++)
        {
        if(ListBox1->Items->Strings[i]==ListBox1->Items->Strings[j])
                {
                ListBox1->Items->Delete(j);
                j--;
                Application->ProcessMessages();
                }
        }
        
}
//---------------------------------------------------------------------------

Wydaje mi się, że powinno działać

0

łał
Dzięki Krecik!

1 użytkowników online, w tym zalogowanych: 0, gości: 1