News & Events
[Review] Listar máquinas da rede
Nesse Review estou republicando o post com as informações adicionais e o link para um novo exemplo, agora totalmente funcional.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls,
WinSock;
[...]
var
Form1: TForm1;
ListaUsuarios: TStringList;
Plataforma: string;
[...]
O restante das informações sobre a dica permanecem as mesmas. Siga os passos abaixo e monte seu exemplo. Se desejar poderá fazer o download de dois exemplos que seguem a mesma linha. São eles:
Os nomes de arquivo são os mesmos, mas o conteúdo é diferente.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
I: shortint;
Nome: string;
IP: string;
begin
try
ListaUsuarios.Clear;
lstEstacoes.Items.Clear;
pnlAguarde.Visible := True;
aniLocalizaEstadoes.Active := True;
Screen.Cursor := crHourGlass;
Plataforma := VersaoWindows;
ListaAmbienteRede;
lstEstacoes.Items.Clear;
for I := 0 to ListaUsuarios.Count - 1 do
begin
Nome := ListaUsuarios[I];
try
IP := GetIP(ListaUsuarios[I]);
except
IP := ' ';
end;
IncluiEstacao(Nome, IP);
Update;
end;
finally
pnlAguarde.Visible := False;
aniLocalizaEstadoes.Active := False;
Screen.Cursor := crDefault;
end;
end;
3. O código do botão Listar Estações faz chama a ouras funções. Por isso inclua também as funções abaixo:
procedure TForm1.IncluiEstacao(AEstacao, AIP: string);
var
Item: TListItem;
begin
with lstEstacoes do
begin
Item := Items.Add;
Item.Caption := AEstacao;
Item.SubItems.Add(AIP);
end;
end;
procedure TForm1.ListaAmbienteRede;
procedure Enumera(Res: PnetResource);
var
Hnd: THandle;
NumeroEntradas: DWord;
Buffer: array[1..255] of TNetResource;
LongBuffer: DWord;
N: Integer;
S: string;
begin
LongBuffer := SizeOf(Buffer);
if WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, Res, Hnd) = No_ERROR then
begin
NumeroEntradas := 255;
WNetEnumResource(Hnd, NumeroEntradas, @Buffer[1], LongBuffer);
for N := 1 to NumeroEntradas do
begin
S := string(Buffer[N].lpRemoteName);
if Plataforma = 'xp' then
if (Buffer[1].dwType = 0) and (Copy(S, 1, 2) = '\\') then
ListaUsuarios.Add(Copy(S, 3, Length(S) - 2));
if Plataforma = '9x' then
if (Buffer[1].dwType = 3) and (Copy(S, 1, 2) = '\\') then
ListaUsuarios.Add(Copy(S, 3, Length(S) - 2));
if (Buffer[N].dwUsage and RESOURCEUSAGE_CONTAINER) = RESOURCEUSAGE_CONTAINER then
Enumera(@Buffer[N]);
Update;
end;
end;
end;
begin
Enumera(nil);
end;
function TForm1.GetIP(AEstacao: string): string;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
begin
WSAStartup(2, WSAData);
HostEnt := GetHostByName(PChar(AEstacao));
with HostEnt^ do
Result :=
Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);
WSACleanup;
end;
function TForm1.VersaoWindows: string;
var
PlatformId, CSDVersion: string;
begin
CSDVersion := '';
case Win32Platform of
VER_PLATFORM_WIN32_WINDOWS:
begin
if Win32MajorVersion = 4 then
case Win32MinorVersion of
0: PlatformId := '9x';
10: PlatformId := '9x';
90: PlatformId := 'ME';
end
else
PlatformId := '9x';
Result := '9x';
end;
VER_PLATFORM_WIN32_NT:
begin
if Length(Win32CSDVersion) > 0 then
CSDVersion := Win32CSDVersion;
if Win32MajorVersion <= 4 then
PlatformId := 'NT'
else if Win32MajorVersion = 5 then
case Win32MinorVersion of
0: PlatformId := '2000';
1: PlatformId := 'XP';
2: PlatformId := '2003';
else
PlatformId := '?';
end
else
PlatformId := '?';
Result := 'xp';
end;
end;
end;
Aqui estão listadas todas as funções e procedimentos necessários. Na seção Downloads você pode efetuar o download do código fonte de exemplo. Até mais.
Siga @tdevrocks no Twitter agora e fique por dentro de todas as atualizações do blog.
Siga também o autor @asrsantos
Hi,
I just wanted to say that I really enjoyed your blog and this post. You make some very informative points. Keep up the great work!
–
Delphi development
Você é o cara. O Repasse de conhecimento enriquece a humanidade.
Olá!
Tentei incorporar ao meu código e não roda, dá access violation.
Outra coisa, dá erro nessas parte do código, precisei comentar
// pnlAguarde.Visible := True;
// aniLocalizaEstadoes.Active := True;
// pnlAguarde.Visible := False;
// aniLocalizaEstadoes.Active := False;
e aqui também: HostEnt := GetHostByName(pChar(AEstacao));
mudei para isso HostEnt := GetHostByName(pansiChar(AEstacao));
Até mais.
Boa noite – Fiz tudo como no seu exemplo, tive que me encontrar em alguns nomes, mas funcionou, apenas uns detalhes que gostaria de saber se tem como resolver, meu aplicativo quando abre, toma a tela toda, não encontrei nada no script que desse ao form, comando pra maximizar, outra coisa é, achei demorado demais a busca, pra iniciar a adesão demora pra caramba. Tinha pensado em por essa busca no meu aplicativo de CHAT, trazer as máquinas da rede e testar, quais estão com meu CHAT aberto pra da sinal de online, mas se eu fizer isso, vou matar meu CHAT. Se tiver uma ideia de como otimizar esse exemplo, agradeço. Boa noite!