如何从本地网络获取所有计算机的列表?

时间:2013-08-15 02:12:35

标签: delphi windows-7 delphi-xe3

我很久以前的这段代码应该返回一个字符串列表,每台计算机连接到我的Windows workgroup,但是当我测试时,我只得到自己的电脑,但我有三台计算机连接到相同的workgroup名称,并显示在我的Windows资源管理器网络列表中。

可能有什么不对?还有其他办法吗?

function FindAllComputers(Workgroup: string; WithIP: Boolean): TStringList;
var
  EnumHandle : THandle;
  WorkgroupRS : TNetResource;
  Buf : Array[1..500] of TNetResource;
  BufSize : cardinal;
  Entries : cardinal;
  Res : Integer;
  Computers : Tstringlist;
  Limit, I: Integer;
begin
  Limit := 0;
  Workgroup := Workgroup + #0;
  FillChar(WorkgroupRS, SizeOf(WorkgroupRS) , 0);
  With WorkgroupRS do
  begin
    dwScope := 2;
    dwType := 3;
    dwDisplayType := 1;
    dwUsage := 2;
    lpRemoteName := @Workgroup[1];
  end;
  WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, 
    @WorkgroupRS, EnumHandle);
  Computers := TStringList.Create;
  repeat
    Entries := 1;
    BufSize := SizeOf(Buf);
    Res := WNetEnumResource(EnumHandle, Entries, @Buf, BufSize);
    if (Res = NO_ERROR) and (Entries = 1) then
    begin
      Computers.Add(StrPas(Buf[1].lpRemoteName));
    end;
    Inc(Limit);
  until (Entries > 0) or (Res <> NO_ERROR) or (Limit > 100);
  WNetCloseEnum( EnumHandle );
  if WithIP then
  begin
    for I := 0 to Computers.Count-1 do
      Computers[I] := Computers[I] + '=' + GetIP(Computers[I]);
  end;
  Result := Computers;
end;

1 个答案:

答案 0 :(得分:5)

请参阅WNetEnumResource的文档,'lpcCount'(代码中的'Entries'参数')返回时会收到枚举的项目数。如果枚举大于0,则终止枚举,但这是预期的。您正在请求枚举一个项目并且该函数执行此操作并将其设置为1.只需从循环终止中删除该条件:

..
until (Res <> NO_ERROR) or (Limit > 100);
..

您可能还想查看代码,f.i。你不需要StrPas