为什么 列举 “局域网”中所有“主机IP” 非常慢???详细代码请看......有无更好的??

LKJ99 2004-02-26 02:50:23
代码也是从CSDN上搜索下载的!!!

function Tfrmmain.GetServerList(var List: TStringList): Boolean;

type

TNetResourceArray = ^TNetResource; //网络类型的数组

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;

//获取整个网络中的文件资源的句柄,lphEnum为返回名柄

Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

RESOURCEUSAGE_CONTAINER, nil, lphEnum);

if Res <> NO_ERROR then exit; //Raise Exception(Res);//执行失败

//获取整个网络中的网络类型信息

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;



function Tfrmmain.GetUsers(GroupName: string; var List: TStringList): Boolean;

type

TNetResourceArray = ^TNetResource; //网络类型的数组

var

NetResource: TNetResource;

Buf: Pointer;

Count, BufSize, Res: DWord;

Ind: Integer;

lphEnum: THandle;

Temp: TNetResourceArray;

begin

Result := False;

List.Clear;

FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息

NetResource.lpRemoteName := @GroupName[1]; //指定工作组名称

NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //类型为服务器(工作组)

NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;

NetResource.dwScope := RESOURCETYPE_DISK; //列举文件资源信息

//获取指定工作组的网络资源句柄

Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);

if Res <> NO_ERROR then Exit; //执行失败

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 then break; //资源列举完毕

if (Res <> NO_ERROR) then Exit; //执行失败

Temp := TNetResourceArray(Buf);

for Ind := 0 to Count - 1 do //列举工作组的计算机名称

begin

//获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun

List.Add(Temp^.lpRemoteName + 2);

Inc(Temp);

end;

FreeMem(Buf);

end;

Res := WNetCloseEnum(lphEnum); //关闭一次列举

if Res <> NO_ERROR then exit; //执行失败

Result := True;

end;



function Tfrmmain.myGetNameByIP(pIP:String):String;

var WSAData:TWSAData;

HostEnt:PHostEnt;

InetAddr:DWORD;

begin

try

Result:='';

InetAddr:=Inet_Addr(PChar(pIP));

WSAStartUp(2,WSAData);

HostEnt:=GetHostByAddr(@InetAddr,sizeof(InetAddr),AF_INet);

if HostEnt<>nil then Result:=HostEnt^.h_name;

finally

WSACleanUp;

end;

end;

procedure Tfrmmain.Button3Click(Sender: TObject);
var

WSAData: TWSAData;

HostEnt: PHostEnt;

sIP: string;

i, j: Integer;

list1, list2: TStringList;

begin

listbox1.Clear;

WSAStartup(2, WSAData);

list1 := TStringList.Create;

list2 := TStringList.Create;

if GetServerList(list1) then

begin

for i := 0 to list1.Count - 1 do

begin

if getusers(list1.Strings[i], list2) then

begin

for j := 0 to list2.Count - 1 do

begin

HostEnt := gethostbyname(PChar(list2.Strings[j]));

if HostEnt <> nil then

begin

with HostEnt^ do

sIP := Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);

end;

listbox1.Items.Add(list2.Strings[j]+','+sIP);

end;

end;

end;

end;

list1.Destroy;

list2.Destroy;

WSACleanup;

end;
...全文
42 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧