Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Список имен машин в сети. [D6, Win95/98, WinME, Win2k, WinXP]


off ©   (2004-08-02 11:26:00) 

Как получить список имен машин доступных в локальной сети?


Rouse_   (2004-08-05 22:57:00) [1]

Вот, кстати, "причесанный" код...
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1091730361&n=4


Rouse_   (2004-08-04 10:43:00) [2]

Это я демку комуто писал, кто-то с форума просил. Просьба была чтобы сканирование было в потоке. Ну и вообще чтобы основной поток не тормозился при сканировании...


Дмитрий Ботвин   (2004-08-03 15:31:00) [3]

Rouse_ а зачем в твоём коде многопоточность используется???


Rouse_   (2004-08-02 14:14:00) [4]

А ты ресурсы не сканируй...

Scan(nrResource[i], false);

замени на

if nrResource[i].dwDisplayType <> RESOURCEDISPLAYTYPE_SERVER then Scan(nrResource[i], false);


off   (2004-08-02 12:38:00) [5]

Прикольно, только работает очень медленно


off   (2004-08-02 11:59:00) [6]

пасибки


Rouse_   (2004-08-02 11:38:00) [7]

Вот держи, код немного не причесанный:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, Winsock, ImgList, ShellAPI;

type
 TDemoThread = class(TThread)
 private
   TreeDomain: TTreeNode;
   TreeServer: TTreeNode;
   TreeShares: TTreeNode;
   Param_dwDisplayType: Byte;
   Param_lpRemoteName: String;
 protected
   procedure Execute; override;
   procedure Scan(Res: TNetResource; Root: boolean);
   procedure AddElement;
   procedure Stop;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   TreeView1: TTreeView;
   StatusBar1: TStatusBar;
   ImageList1: TImageList;
   procedure Button1Click(Sender: TObject);
   procedure TreeView1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure TreeView1DblClick(Sender: TObject);
 private
   Thread: TDemoThread;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function GetIPAddress(NetworkName: String): String;
var
Error: DWORD;
HostEntry: PHostEnt;
Data: WSAData;
Address: In_Addr;
begin
 Delete(NetworkName, 1, 2);
 Error:=WSAStartup(MakeWord(1, 1), Data);
 if Error = 0 then
 begin
   HostEntry:=gethostbyname(PChar(NetworkName));
   Error:=GetLastError;
   if Error = 0 then
   begin
     Address:=PInAddr(HostEntry^.h_addr_list^)^;
     Result:=inet_ntoa(Address);
   end
   else
    Result:='Unknown';
 end
 else
   Result:='Error';
 WSACleanup;
end;

{ TDemoThread }

procedure TDemoThread.Execute;
var
 R:TNetResource;
begin
 inherited;
 Priority := tpIdle;
 FreeOnTerminate := True;
 Resume;
 Scan(R, True);
 TreeDomain := nil;
 TreeServer := nil;
 Synchronize(Stop);
end;

procedure TDemoThread.Scan(Res: TNetResource; Root: boolean);
var
hEnum: cardinal;
nrResource: array[0..512] of TNetResource;
dwSize: DWORD;
numEntries: DWORD;
I: DWORD;
dwResult: DWORD;
begin
 if Root then
   dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
     0, nil, hEnum)
 else
   dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
     0, @Res, hEnum);
 if dwResult = NO_ERROR then
 begin
   dwSize := SizeOf(nrResource);
   numEntries := DWORD(-1);
   if WNetEnumResource(hEnum, numEntries, @nrResource, dwSize) = NO_ERROR then
   begin
     for i := 0 to numEntries - 1 do
     begin
       if Terminated then Break;
       with nrResource[i] do
       begin
         Param_dwDisplayType := dwDisplayType;
         Param_lpRemoteName := lpRemoteName;
       end;
       if Assigned(nrResource[i].lpRemoteName) then
         Synchronize(AddElement);
       Scan(nrResource[i], false);
     end;
   WNetCloseEnum(hEnum);
   end;
 end;
end;

procedure TDemoThread.AddElement;
begin
 Application.ProcessMessages;
 if Param_dwDisplayType = RESOURCEDISPLAYTYPE_DOMAIN then
 begin
   TreeDomain := Form1.TreeView1.Items.Add(nil, Param_lpRemoteName);
   TreeDomain.StateIndex := 1;
 end
 else
   if Param_dwDisplayType = RESOURCEDISPLAYTYPE_SERVER then
   begin
     TreeServer := Form1.TreeView1.Items.AddChild(TreeDomain, Param_lpRemoteName + ' IP: ' + GetIPAddress(Param_lpRemoteName));
     TreeServer.StateIndex := 2;
   end
   else
   begin
     TreeShares := Form1.TreeView1.Items.AddChild(TreeServer, Param_lpRemoteName);
     TreeShares.StateIndex := 3;
   end;
end;

procedure TDemoThread.Stop;
begin
 Form1.StatusBar1.Panels[1].Text := '   Сканирование завершено ...';
 Form1.Button1.Caption := 'Начать сканирование';
 Form1.Button1.Enabled := True;
 Form1.Tag := 0;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 Tag := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Tag := Tag + 1;
 if (Tag mod 2) = 1 then
 begin
   TreeView1.Items.Clear;
   StatusBar1.Panels[1].Text := '   Идет сканирование ...';
   Button1.Caption := 'Остановить сканирование';
   Thread := TDemoThread.Create(False);
 end
 else
 begin
   StatusBar1.Panels[1].Text := '   Завершение потока ...';
   Button1.Enabled := False;
   Thread.Terminate;
 end;
end;

procedure TForm1.TreeView1Click(Sender: TObject);
begin
 if Assigned(TreeView1.Selected) then
   StatusBar1.Panels[0].Text := '   ' + TreeView1.Selected.Text
 else
   StatusBar1.Panels[0].Text := '   Поле не выбрано ...';
end;

procedure TForm1.TreeView1DblClick(Sender: TObject);
var
 Str: String;
begin
 if Assigned(TreeView1.Selected) then
 begin
   Str := TreeView1.Selected.Text;
   if Copy(Str, 1, 2) <> '\\' then Exit;
   if Pos(' IP:', Str) <> 0 then
     ShellExecute(Handle, 'explore', PChar(Copy(Str, 1, Pos(' IP:', Str))), nil, nil, SW_SHOW)
   else
     ShellExecute(Handle, 'explore', PChar(Str), nil, nil, SW_SHOW);
 end;
end;

end.


Более нармальная версия кода лежит на http://delphi.k-jarve.ee/programm
но сервер пока не работает к сожалению...


Наверх

Титульная страница Поиск, карта сайта Написать письмо