help me! 那位大侠可以给小第讲一下怎样可以获得网络中可用的计算机名,方法简单最后。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在DELPHI程序中获取网络资源信息1.获取网络类型信息 局域网中可以是由多和类型的网络组成,用API函数WNETOPENENUM和WNETENUMRESOURCE可以获取网络类型信息。 用WNETOPENENUM 函数返回一个句柄,作为WNETENUMRESOURCE列举网络资源的依据,列举“整个网络”的工作组名称,因而网络范围为Resource_GloalNet(所有机器),资源类型为ResourceType_Disk (文件资源),资源用途为ResourceUsage_Container(所有container资源),网络层次为最高层(NIL),这样可以得到一个句柄以便列举网络资源。 主要源代码如下: {Res: DWORD;lphEnum:THandle;} res := WNetOpenEnum( Resourece_GlobalNet, ResourceType_Disk,ResourceUsage_Container,Nil,lphEnum); //执行失败 If Res <> NO_Error then exit; 用API函数WNETENUMRESOURCE可以获取网络类型信息,此时要用到上面获取的句柄lphEnum,可以获取一个NetResource类型的数组,每个NETRESOURCE元素即为一和网络类型信息。WNetOpenenum用于获取一个网络资源句柄,作为WNenEnumResource列举网络资源的依据,其函数原型如 function WNetOpenEnum(dwScope)//网络范围,Resource_Connected//已连接机器),Resource_GlobalNet//所有机器,Resource_Remembered//已记忆的机器,dwType//资源类型,ResourceTpye_Any//所有资源,ResourceType_Disk//文件资源,ResourceType_Print//打印资源,dwUsage//资源用途,0//所有资源,ResourceUsage_ConnectAble//所有可连接资源,ResourceUsage_Container//所有container资源,仅在dwScope为ResourceE_GlobalNet 有效。 procedure GetServerList(List:TStrings);Type {$H+} PMyRec = ^MyRec; MyRec = Record dwScope : Integer; dwType : Integer; dwDisplayType : Integer; dwUsage : Integer; LocalName : String; RemoteName : String; Comment : String; Provider : String; End; {H-}Var NetResource : TNetResource; TempRec : PMyRec; Buf : Pointer; Count, BufSize, Res : DWORD; lphEnum : THandle; p : PNetResourceArr; i, j : SmallInt; NetworkTypeList : TList;begin // Result := False; NetworkTypeList := TList.Create; List.BeginUpdate; List.Clear; GetMem(Buf, 8192); Try //获取某个网络类型的文件资源的句柄,lphInum为返回句柄 Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, Nil,lphEnum); If Res <> 0 Then Raise Exception(Res); //执行失败 //获取整个网络中的网络类型信息 Count := $FFFFFFFF; //不限资源数目 BufSize := 8192; //缓冲区大小设置为8K Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); If Res = ERROR_NO_MORE_ITEMS Then Exit; //资源列举完毕 If (Res <> 0) Then Raise Exception(Res); //执行失败 P := PNetResourceArr(Buf); For I := 0 To Count - 1 Do Begin //记录各个网络类型的信息 New(TempRec); TempRec^.dwScope := P^.dwScope; TempRec^.dwType := P^.dwType ; TempRec^.dwDisplayType := P^.dwDisplayType ; TempRec^.dwUsage := P^.dwUsage ; TempRec^.LocalName := StrPas(P^.lpLocalName); TempRec^.RemoteName := StrPas(P^.lpRemoteName); TempRec^.Comment := StrPas(P^.lpComment); TempRec^.Provider := StrPas(P^.lpProvider); NetworkTypeList.Add(TempRec); Inc(P); End; Res := WNetCloseEnum(lphEnum); //WNETCLOSEENUM关闭一个列举句柄 If Res <> 0 Then Raise Exception(Res); For J := 0 To NetworkTypeList.Count-1 Do //列出各个网络类型中的所有工作组名称 Begin //列出一个网络类型中的所有工作组名称 TempRec := NetworkTypeList.Items[J]; NetResource := TNetResource(TempRec^); //网络类型信息 //获取某个网络类型的文件资源的句柄,NETRESOURCE为网络类型信息,lphInum为返回句柄 Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum); If Res <> 0 Then Raise Exception(Res); While true Do Begin Count := $FFFFFFFF; //不限资源数目 BufSize := 8192; //缓冲区大小设置为8K //获取一个网络类型的文件资源信息 Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); If Res = ERROR_NO_MORE_ITEMS Then Break; //资源列举完毕 If (Res <> 0) Then Raise Exception(Res); //执行失败 P := PNetResourceArr(Buf); For I := 0 To Count - 1 Do //列举各个工作组的信息 Begin List.Add(P^.lpRemoteName); //取得一个工作组的名称 Inc(P); End; End; End; Res := WNetCloseEnum(lphEnum); //关闭一次列举 If Res <> 0 Then Raise Exception(Res); //执行失败 //Result := True; Finally FreeMem(Buf); NetworkTypeList.Destroy; End; List.EndUpdate;end;procedure GetUserList(fServer:string;List:TStrings);Var NetResource : TNetResource; Buf : Pointer; Count, BufSize, Res : DWord; Ind : Integer; lphEnum : THandle; Temp : PNetResourceArr;Begin//RESULT := FALSE; List.Clear; GetMem(Buf, 8192); Try FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息 NetResource.lpRemoteName := @fServer[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 <> 0 Then Exit; //执行失败 While True Do //列举指定工作组的网络资源 Begin Count := $FFFFFFFF; //不限资源数目 BufSize := 8192; //缓冲区大小设置为8K Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); //获取计算机名称 If Res = ERROR_NO_MORE_ITEMS Then Exit; //资源列举完毕 If (Res <> 0) then Exit; //执行失败 Temp := PNetResourceArr(Buf); //列举工作组的计算机名称 For Ind := 0 to Count - 1 do Begin //获取工作组的计算机名称,+2表示删除“\”,如\khr=>khr List.Add(Temp^.lpRemoteName + 2); { Add all the network usernames to List StringList } Inc(Temp); End; End; Res := WNetCloseEnum(lphEnum); //关闭一次列举 If Res <> 0 Then Raise Exception(Res); //执行失败// Result := True; Finally FreeMem(Buf); End;End; 关于中文双引号的显示和输入问题 请问怎么在程序中用net send??? 如何将pbyte指向的byte数据传递给byte数组或char等 急急急,哪里有delphi课件 如何在设计期间得程序的版本号 怎么用MaskEdit实现限制用户只能输入某几个字母? 怎样在grid中取LookupComboBox中的当前记录值? 为什么Form不能free 讨论,哪一种网络防火墙软件最好用?! Delphi 中的SQL语法怎么用日期格式? 请教一个使DBGRID的某个单元格获得焦点的问题 我关联操作启动了程序,启动后的程序如何得到点击的那个文件名?
1.获取网络类型信息
局域网中可以是由多和类型的网络组成,用API函数WNETOPENENUM和WNETENUMRESOURCE可以获取网络类型信息。
用WNETOPENENUM 函数返回一个句柄,作为WNETENUMRESOURCE列举网络资源的依据,列举“整个网络”的工作组名称,
因而网络范围为Resource_GloalNet(所有机器),资源类型为ResourceType_Disk (文件资源),资源用途
为ResourceUsage_Container(所有container资源),网络层次为最高层(NIL),这样可以得到一个句柄以便列举网络资源。
主要源代码如下:
{Res: DWORD;lphEnum:THandle;}
res := WNetOpenEnum( Resourece_GlobalNet, ResourceType_Disk,ResourceUsage_Container,Nil,lphEnum);
//执行失败
If Res <> NO_Error then exit;
用API函数WNETENUMRESOURCE可以获取网络类型信息,此时要用到上面获取的句柄lphEnum,可以获取一个NetResource类型
的数组,每个NETRESOURCE元素即为一和网络类型信息。WNetOpenenum用于获取一个网络资源句柄,作为WNenEnumResource列举网络资源的依据,其函数原型如
function WNetOpenEnum(dwScope)//网络范围,Resource_Connected//已连接机器)
,Resource_GlobalNet//所有机器,Resource_Remembered//已记忆的机器,dwType//资源类型
,ResourceTpye_Any//所有资源,ResourceType_Disk//文件资源,ResourceType_Print//打印资源,dwUsage//资源用途,0//所有资源,ResourceUsage_ConnectAble//所有可连接资源
,ResourceUsage_Container//所有container资源,仅在dwScope为ResourceE_GlobalNet 有效。
procedure GetServerList(List:TStrings);
Type
{$H+}
PMyRec = ^MyRec;
MyRec = Record
dwScope : Integer;
dwType : Integer;
dwDisplayType : Integer;
dwUsage : Integer;
LocalName : String;
RemoteName : String;
Comment : String;
Provider : String;
End;
{H-}
Var
NetResource : TNetResource;
TempRec : PMyRec;
Buf : Pointer;
Count, BufSize, Res : DWORD;
lphEnum : THandle;
p : PNetResourceArr;
i, j : SmallInt;
NetworkTypeList : TList;
begin
// Result := False; NetworkTypeList := TList.Create;
List.BeginUpdate;
List.Clear;
GetMem(Buf, 8192);
Try
//获取某个网络类型的文件资源的句柄,lphInum为返回句柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
If Res <> 0 Then Raise Exception(Res); //执行失败 //获取整个网络中的网络类型信息
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If Res = ERROR_NO_MORE_ITEMS Then Exit; //资源列举完毕
If (Res <> 0) Then Raise Exception(Res); //执行失败
P := PNetResourceArr(Buf);
For I := 0 To Count - 1 Do
Begin //记录各个网络类型的信息
New(TempRec);
TempRec^.dwScope := P^.dwScope;
TempRec^.dwType := P^.dwType ;
TempRec^.dwDisplayType := P^.dwDisplayType ;
TempRec^.dwUsage := P^.dwUsage ;
TempRec^.LocalName := StrPas(P^.lpLocalName);
TempRec^.RemoteName := StrPas(P^.lpRemoteName);
TempRec^.Comment := StrPas(P^.lpComment);
TempRec^.Provider := StrPas(P^.lpProvider);
NetworkTypeList.Add(TempRec);
Inc(P);
End;
Res := WNetCloseEnum(lphEnum); //WNETCLOSEENUM关闭一个列举句柄
If Res <> 0 Then Raise Exception(Res);
For J := 0 To NetworkTypeList.Count-1 Do //列出各个网络类型中的所有工作组名称
Begin //列出一个网络类型中的所有工作组名称
TempRec := NetworkTypeList.Items[J];
NetResource := TNetResource(TempRec^); //网络类型信息
//获取某个网络类型的文件资源的句柄,NETRESOURCE为网络类型信息,lphInum为返回句柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
If Res <> 0 Then Raise Exception(Res);
While true Do
Begin
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K //获取一个网络类型的文件资源信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If Res = ERROR_NO_MORE_ITEMS Then Break; //资源列举完毕
If (Res <> 0) Then Raise Exception(Res); //执行失败
P := PNetResourceArr(Buf);
For I := 0 To Count - 1 Do //列举各个工作组的信息
Begin
List.Add(P^.lpRemoteName); //取得一个工作组的名称
Inc(P);
End;
End;
End;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
If Res <> 0 Then Raise Exception(Res); //执行失败
//Result := True;
Finally
FreeMem(Buf);
NetworkTypeList.Destroy;
End;
List.EndUpdate;
end;procedure GetUserList(fServer:string;List:TStrings);
Var
NetResource : TNetResource;
Buf : Pointer;
Count,
BufSize,
Res : DWord;
Ind : Integer;
lphEnum : THandle;
Temp : PNetResourceArr;
Begin
//RESULT := FALSE; List.Clear;
GetMem(Buf, 8192);
Try
FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息
NetResource.lpRemoteName := @fServer[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 <> 0 Then Exit; //执行失败
While True Do //列举指定工作组的网络资源
Begin
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); //获取计算机名称
If Res = ERROR_NO_MORE_ITEMS Then Exit; //资源列举完毕
If (Res <> 0) then Exit; //执行失败
Temp := PNetResourceArr(Buf);
//列举工作组的计算机名称
For Ind := 0 to Count - 1 do
Begin
//获取工作组的计算机名称,+2表示删除“\”,如\khr=>khr
List.Add(Temp^.lpRemoteName + 2); { Add all the network usernames to List StringList }
Inc(Temp);
End;
End;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
If Res <> 0 Then Raise Exception(Res); //执行失败
// Result := True;
Finally
FreeMem(Buf);
End;
End;