0

我很久以前得到的这段代码应该返回一个字符串列表,每台计算机都连接到我的 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;
4

1 回答 1

5

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

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

您可能还想查看您不需要的代码StrPas

于 2013-08-15T10:21:23.013 回答