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
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!