delphi的朋友们,能否告诉我,什样才能得到整个局域网中的计算机名?最好是代码短一点.(200分)

  • 主题发起人 主题发起人 zhucp
  • 开始时间 开始时间
Z

zhucp

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi的朋友们,能否告诉我,什样才能得到整个局域网中的计算机名?最好是代码短一点.
 
很简单的!
 
获得网络邻居所有机器名

procedure TForm1.Button1Click(Sender: TObject);
VAR
command:string ;
comline: pchar ;
begin
command:='COMMAND.COM /C net view>c:/~~~.txt';
comline:=pchar(command);
WinExec(comline, sw_hide);
timer1.Enabled:=true;
end;

//每秒试一次
procedure TForm1.Timer1Timer(Sender: TObject);
var f:tstringlist;
ll,ii:integer;
s1,s:string;
b:bool;
begin
f:=tstringlist.Create;
try
f.LoadFromFile('c:/~~~.txt');
except
end;
if f.Count>10 then begin
memo1.Clear;
memo1.lines.add(f.text);
timer1.Enabled:=false;
f.Free;
//去掉多余的行和'//'
for ll:=memo1.lines.count-1 downto 0 do begin
if strpos(pchar(memo1.lines.strings[ll]),'//')=nil then
memo1.lines.delete(ll)
else
memo1.lines.Strings[ll]:=delspace(memo1.lines.Strings[ll]);
end;
timer1.enabled:=False;
end;
 
應該還有API函數可以實現的
 
procedure GetDomainList(TV:TTreeView);
var
i:Integer;
ErrCode:Integer;
NetRes:Array[0..1023] of TNetResource;
EnumHandle:THandle;
EnumEntries:DWord;
BufferSize:DWord;
begin
try
With NetRes[0] do
begin
dwScope :=RESOURCE_GLOBALNET;
dwType :=RESOURCETYPE_ANY;
dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN;
dwUsage :=RESOURCEUSAGE_CONTAINER;
lpLocalName :=NIL;
lpRemoteName :=NIL;
lpComment :=NIL;
lpProvider :=NIL;
end;
//get net root
ErrCode:=
WNetOpenEnum(
RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,
@NetRes[0],
EnumHandle
);
If ErrCode=NO_ERROR then
begin
EnumEntries:=1;
BufferSize:=SizeOf(NetRes);
ErrCode:=WNetEnumResource(
EnumHandle,
EnumEntries,
@NetRes[0],
BufferSize
);
WNetCloseEnum(EnumHandle);
If ErrCode=NO_ERROR then
begin
ErrCode:=WNetOpenEnum(
RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,
@NetRes[0],
EnumHandle
);
EnumEntries:=1024;
BufferSize:=SizeOf(NetRes);
ErrCode:=WNetEnumResource(
EnumHandle,
EnumEntries,
@NetRes[0],
BufferSize
);

IF ErrCode=No_Error then
for i:=0 to 1024 do
begin
if(NetRes.lpProvider=nil) then
begin
showmessage('网络上共有'+inttostr(i)+'个对象。');
break;
end
else
with TV do
begin
Items.Add(TV.Selected,'第'+inttostr(i+1)+'个对象');
Items.Add(TV.Selected,'服务提供商:'+string(NetRes.lpProvider));
Items.Add(TV.Selected,'本机名:'+string(NetRes.lpLocalName));
Items.Add(TV.Selected,'远程机名或工作组名:'+string(NetRes.lpRemoteName));
Items.Add(TV.Selected,'评注:'+string(NetRes.lpComment));
Items.Add(TV.Selected,'-------');
end;
end;
end;
end;
except
showmessage('网络邻居上没有工作组或主机');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
GetDomainList(TreeView1);
end;
 
TNetResourceArray = ^TNetResource; //网络资源类型的数组
//函数GetServerList列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,
//参数List中返回服务器(工作组)的名称
Function GetServerList( var List : TStringList ) : Boolean;
Var
NetResource : TNetResource;
Buf : Pointer;
Count,BufSize,Res : DWORD;
lphEnum : THandle;
p:TNetResourceArray;
i,j : SmallInt;
NetworkTypeList : TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
If Res <> NO_ERROR Then exit;
//执行失败,退出

//执行成功,开始获取整个网络中的网络类型信息
Count := $FFFFFFFF;
//不限资源数目
BufSize := 8192;
//缓冲区大小设置为8K
GetMem(Buf, BufSize);
//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If ( Res = ERROR_NO_MORE_ITEMS )
//资源列举完毕
or (Res <> NO_ERROR )
//执行失败
Then Exit;

P := TNetResourceArray(Buf);
For I := 0 To Count - 1 Do
//记录各个网络类型的信息
Begin
NetworkTypeList.Add(p);
Inc(P);
End;

//WNetCloseEnum关闭一个列举句柄
Res:= WNetCloseEnum(lphEnum);
//关闭一次列举
If Res <> NO_ERROR Then exit;
For J := 0 To NetworkTypeList.Count-1 Do
//列出各个网络类型中的所有工作组名称
Begin
//列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^);
//网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
If Res <> NO_ERROR Then break;
//执行失败
While true Do
//列举一个网络类型的所有工作组的信息
Begin
Count := $FFFFFFFF;
//不限资源数目
BufSize := 8192;
//缓冲区大小设置为8K
GetMem(Buf, BufSize);
//申请内存,用于获取工作组信息,获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If ( Res = ERROR_NO_MORE_ITEMS )
//资源列举完毕
or (Res <> NO_ERROR)
//执行失败
then break;
P := TNetResourceArray(Buf);
For I := 0 To Count - 1 Do
//列举各个工作组的信息
Begin
List.Add( StrPAS( P^.lpRemoteName ));
//取得一个工作组的名称
Inc(P);
End;
End;
Res := WNetCloseEnum(lphEnum);
//关闭一次列举
If Res <> NO_ERROR Then break;
//执行失败
End;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;

procedure TForm1.Button1Click(Sender: TObject);
var
sl:TstringList;
i:integer;
begin
memo1.lines.Clear;
sl:=Tstringlist.create;
if GetServerList(sl) then
begin
memo1.lines.Add('总共找到'+inttostr(sl.count)+'个工作组!');
for i:=0 to sl.count-1 do
memo1.lines.Add (sl.Strings);
end
else
memo1.lines.Add('没有找到工作组!');
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部