有方法可以获取局域网中所有计算机的计算机名吗? RT分就这么多了,大家见谅! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.edulife.com.cn/Infos/189912/30189912007601.html 用楼上的方法需要uses WINSOCK;用循环的方式可以实现,但效率比较低到vc或vb的论坛去找找,我记得看到过只调用一个方法就能搞定的 对API不太清楚,能给我解释一下里面的意思吗? 下面的例子可以遍历和你同一网段的所有计算机,既可得工作组又可得用户名和ip,你自己加个TListView就行了procedure TForm1.FindIpClick(Sender: TObject);type TaPInAddr = array [0..10] of PInAddr; PaPInAddr = ^TaPInAddr;var lpVerInfo : OSVERSIONINFO; NetRes,NetRes_User : Array[0..9] of TNetResource; ErrCode:integer; EnumHandle : THandle; I,J,K,Group_No,Total : Integer; EnumEntries : DWord; BufferSize : DWord; phe : PHostEnt; pptr : PaPInAddr; Buffer : array [0..63] of char; GInitData : TWSADATA; IpAddress,GroupName,UserName,lpProvider : string; p :pchar; ListItem: TListItem;begin StatusBar1.Panels[0].Text := '正在查询所有网上邻居......'; delay(1); Total := 0; 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; ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@NetRes[0],EnumHandle); If ErrCode = NO_ERROR then begin EnumEntries:=100; BufferSize:=SizeOf(NetRes); //查找组 ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize); lpProvider := NetRes[0].lpProvider; WNetCloseEnum(EnumHandle); with ListView1 do begin Items.Clear; Group_No := 0; //组 //由于NT或2000多了一个"Microsoft Windows 网络"组,因此要多一次查询组操作 //如果是win9X,下面这段不要 lpVerInfo.dwOSVersionInfoSize := SizeOf(lpVerInfo); GetVersionEx(lpVerInfo); if (lpVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER,@NetRes[Group_No],EnumHandle); EnumEntries:=1024; BufferSize:=SizeOf(NetRes_User); ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[Group_No],BufferSize); end; // while ((NetRes[Group_No].lpRemoteName<>nil) and (NetRes[Group_No].lpProvider = lpProvider)) do //遍历组 begin //组用户 GroupName := NetRes[Group_No].lpRemoteName; ListItem := Items.Add; Listitem.Caption := GroupName; ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER,@NetRes[Group_No],EnumHandle); EnumEntries:=1024; BufferSize:=SizeOf(NetRes_User); ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes_User[0],BufferSize); IF ErrCode=No_Error then begin I:=0; while ((NetRes_User[I].lpRemoteName<>nil) and (NetRes_User[I].lpProvider = lpProvider)) do //遍历组用户 begin UserName := Copy(NetRes_User[I].lpRemoteName,3,Length(NetRes_User[I].lpRemoteName)); p := PChar(UserName); For J:=0 to Length(UserName)-1 do Buffer[J] := p[J]; Buffer[J] := #0; //查该机器的ip WSAStartup($101, GInitData); IpAddress := ''; phe :=GetHostByName(Buffer); if phe = nil then break; ListItem.SubItems.Add(UserName); pptr := PaPInAddr(Phe^.h_addr_list); K := 0; while pptr^[K] <> nil do begin IpAddress := StrPas(inet_ntoa(pptr^[K]^)); ListItem.SubItems.Add(IpAddress); Inc(K); end; ListItem.SubItems.Add(NetRes_User[I].lpComment); WSACleanup; I:=I+1; Total := Total + 1; ListItem := Items.Add; Listitem.Caption := ''; end; end; ListView1.Items.Delete(ListView1.Items.IndexOf(ListItem)); Group_No := Group_No + 1; end; end; end; StatusBar1.Panels[0].Text :='共找到' + IntToStr(Total) + '个用户';end;你还要在uses里加上WinSock。 楼上,请问要懂这些是不是要先学API,应该看什么书好呢? TO:jackie168(花好月圓) ( ) 我对API不太熟悉,看不太懂你的代码,看MSDN太郁闷英文很难看呀!请问API里面知识这么多,难道你们真的是买本厚厚的书把它啃完吗?想请问应该怎么学习、对待API呢? to lxh84(郁闷的鱼) 需要什么就看什么,不是把什么都看好了,再来写做。 TO pick() 请问哪本书好点? 请问PInAddr是什么类型,用来做什么的,怎么在MSDN都找不到它呀? TO:jackie168(花好月圓) 照你的方法做,出现错误:List Out Of Index我花了很久时间还是看不太明白你的程序。 TO sunmingdong()怎么用循环方法呀,好象那个方法要知道计算机的IP才能得到计算机名的,但怎么才能获得局域网全部IP没说。 数据库备份后,为何不能成功还原 如何编程登录进入远程系统并执行命令,已知用户名和密码 求解:获得本机当前的网络数据流量? 卸载动态链接库题 人越来越少~~~~~ 数据库备份和整理? DELPHI安装问题 谁能提供一个算法啊!! 报表中文折行的问题 有没有办法只调试delphi中的一个窗口?像在vc中一样。 请问创建临时表的问题 Delphi 程序运行的构造、加载过程
你自己加个TListView就行了procedure TForm1.FindIpClick(Sender: TObject);
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
lpVerInfo : OSVERSIONINFO; NetRes,NetRes_User : Array[0..9] of TNetResource;
ErrCode:integer;
EnumHandle : THandle;
I,J,K,Group_No,Total : Integer;
EnumEntries : DWord;
BufferSize : DWord; phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
GInitData : TWSADATA;
IpAddress,GroupName,UserName,lpProvider : string;
p :pchar;
ListItem: TListItem;
begin
StatusBar1.Panels[0].Text := '正在查询所有网上邻居......';
delay(1);
Total := 0;
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;
ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@NetRes[0],EnumHandle);
If ErrCode = NO_ERROR then
begin
EnumEntries:=100;
BufferSize:=SizeOf(NetRes);
//查找组
ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize);
lpProvider := NetRes[0].lpProvider;
WNetCloseEnum(EnumHandle);
with ListView1 do
begin
Items.Clear;
Group_No := 0;
//组 //由于NT或2000多了一个"Microsoft Windows 网络"组,因此要多一次查询组操作
//如果是win9X,下面这段不要
lpVerInfo.dwOSVersionInfoSize := SizeOf(lpVerInfo);
GetVersionEx(lpVerInfo);
if (lpVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) then
begin
ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,@NetRes[Group_No],EnumHandle);
EnumEntries:=1024;
BufferSize:=SizeOf(NetRes_User);
ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[Group_No],BufferSize);
end;
//
while ((NetRes[Group_No].lpRemoteName<>nil) and (NetRes[Group_No].lpProvider = lpProvider)) do //遍历组
begin
//组用户
GroupName := NetRes[Group_No].lpRemoteName;
ListItem := Items.Add;
Listitem.Caption := GroupName;
ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,@NetRes[Group_No],EnumHandle);
EnumEntries:=1024;
BufferSize:=SizeOf(NetRes_User);
ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes_User[0],BufferSize);
IF ErrCode=No_Error then
begin
I:=0;
while ((NetRes_User[I].lpRemoteName<>nil) and (NetRes_User[I].lpProvider = lpProvider)) do //遍历组用户
begin
UserName := Copy(NetRes_User[I].lpRemoteName,3,Length(NetRes_User[I].lpRemoteName));
p := PChar(UserName);
For J:=0 to Length(UserName)-1 do
Buffer[J] := p[J];
Buffer[J] := #0;
//查该机器的ip
WSAStartup($101, GInitData);
IpAddress := '';
phe :=GetHostByName(Buffer);
if phe = nil then break;
ListItem.SubItems.Add(UserName);
pptr := PaPInAddr(Phe^.h_addr_list);
K := 0;
while pptr^[K] <> nil do
begin
IpAddress := StrPas(inet_ntoa(pptr^[K]^));
ListItem.SubItems.Add(IpAddress);
Inc(K);
end;
ListItem.SubItems.Add(NetRes_User[I].lpComment);
WSACleanup; I:=I+1;
Total := Total + 1;
ListItem := Items.Add;
Listitem.Caption := '';
end;
end;
ListView1.Items.Delete(ListView1.Items.IndexOf(ListItem));
Group_No := Group_No + 1;
end;
end;
end;
StatusBar1.Panels[0].Text :='共找到' + IntToStr(Total) + '个用户';
end;
你还要在uses里加上WinSock。
我对API不太熟悉,看不太懂你的代码,看MSDN太郁闷英文很难看呀!
请问API里面知识这么多,难道你们真的是买本厚厚的书把它啃完吗?想请问应该怎么学习、对待API呢?
需要什么就看什么,不是把什么都看好了,再来写做。
请问哪本书好点?
照你的方法做,出现错误:List Out Of Index
我花了很久时间还是看不太明白你的程序。
怎么用循环方法呀,好象那个方法要知道计算机的IP才能得到计算机名的,但怎么才能获得局域网全部IP没说。