U_NET.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:7k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit U_NET;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, Buttons, ComCtrls, ExtCtrls, ImgList;
  6. type
  7.   TNetResourceArray = ^TnetResource;
  8.   TfrmNet = class(TForm)
  9.     StatusBar: TStatusBar;
  10.     Panel1: TPanel;
  11.     TreeView: TTreeView;
  12.     Panel2: TPanel;
  13.     btnOK: TSpeedButton;
  14.     btnCancel: TSpeedButton;
  15.     ImageList: TImageList;
  16.     procedure FormActivate(Sender: TObject);
  17.     procedure TreeViewClick(Sender: TObject);
  18.     procedure btnOKClick(Sender: TObject);
  19.     procedure btnCancelClick(Sender: TObject);
  20.   private
  21.     procedure GetComputerName; //获取计算机名
  22.     procedure GetGroupName; //获取组名
  23.     { Private declarations }
  24.   public
  25.     { Public declarations }
  26.   end;
  27.   
  28. //打开窗体,并返回选定的计算机名。
  29. function NetExecute(aFormClass: TFormClass): string;
  30. var
  31.   frmNet: TfrmNet;
  32.   node: Ttreenode;
  33.   aComputerName : string;//全局变量,存储选中的主机名 
  34. implementation
  35. {$R *.DFM}
  36. //打开窗体,并返回选定的计算机名。
  37. function NetExecute(aFormClass: TFormClass): string;
  38. begin
  39.   aComputerName := '';
  40.   with aFormClass.Create(Application) do
  41.   begin
  42.     try
  43.       showModal;
  44.     finally
  45.       free;
  46.     end;
  47.     result := aComputerName;
  48.   end;
  49. end;
  50. procedure TfrmNet.FormActivate(Sender: TObject);
  51. begin
  52.   node := treeview.Items.add(Treeview.topitem, '整个网络');
  53.   node.imageindex := 0;
  54.   treeview.SetFocus;
  55. end;
  56. //获取组名
  57. procedure TfrmNet.GetGroupName;
  58. var
  59.   NetResource: TNetResource;
  60.   Buf: Pointer;
  61.   Count, BufSize, Res: DWORD;
  62.   lphEnum: THandle;
  63.   p: TNetResourceArray;
  64.   i, j: SmallInt;
  65.   NetworkTypeList: TList;
  66.   my_node_1: Ttreenode;
  67. begin
  68.   statusbar.panels[0].text := '正在列举域名...,请稍侯';
  69.   statusbar.refresh;
  70.   screen.Cursor := crHourGlass;
  71.   NetworkTypeList := TList.Create;
  72.   //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
  73.   Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
  74.     RESOURCEUSAGE_CONTAINER, nil, lphEnum);
  75.   if Res <> NO_ERROR then exit; //执行失败
  76.   //获取整个网络中的网络类型信息
  77.   Count := $FFFFFFFF; //不限资源数目
  78.   BufSize := 8192; //缓冲区大小设置为8K
  79.   GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
  80.   Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
  81.   if (Res = ERROR_NO_MORE_ITEMS) //资源列举完毕
  82.     or (Res <> NO_ERROR) //执行失败
  83.     then Exit;
  84.   P := TNetResourceArray(Buf);
  85.   for I := 0 to Count - 1 do //记录各个网络类型的信息
  86.   begin
  87.     NetworkTypeList.Add(p);
  88.     Inc(P);
  89.   end;
  90.   //WNetCloseEnum关闭一个列举句柄
  91.   Res := WNetCloseEnum(lphEnum); //关闭一次列举
  92.   if Res <> NO_ERROR then exit;
  93.   for J := 0 to NetworkTypeList.Count - 1 do //列出各个网络类型中的所有工作组名称
  94.   begin //列出一个网络类型中的所有工作组名称
  95.     NetResource := TNetResource(NetworkTypeList.Items[J]^); //网络类型信息
  96.   //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
  97.     Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
  98.       RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
  99.     if Res <> NO_ERROR then break; //执行失败
  100.     while true do //列举一个网络类型的所有工作组的信息
  101.     begin
  102.       Count := $FFFFFFFF; //不限资源数目
  103.       BufSize := 8192; //缓冲区大小设置为8K
  104.       GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
  105.               //获取一个网络类型的文件资源信息,
  106.       Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
  107.       if (Res = ERROR_NO_MORE_ITEMS) //资源列举完毕
  108.         or (Res <> NO_ERROR) //执行失败
  109.         then break;
  110.       P := TNetResourceArray(Buf);
  111.       for I := 0 to Count - 1 do //列举各个工作组的信息
  112.       begin
  113.         my_node_1 := treeview.Items.addchild(node, StrPAS(P^.lpRemoteName)); //取得一个工作组的名称
  114.         my_node_1.imageindex := 1;
  115.         Inc(P);
  116.       end;
  117.     end;
  118.     Res := WNetCloseEnum(lphEnum); //关闭一次列举
  119.     if Res <> NO_ERROR then break; //执行失败
  120.   end;
  121.   FreeMem(Buf);
  122.   NetworkTypeList.Destroy;
  123.   screen.Cursor := crDefault;
  124.   statusbar.panels[0].text := '';
  125.   statusbar.refresh;
  126. end;
  127. //获取计算机名
  128. procedure TfrmNet.GetComputerName;
  129. var
  130.   NetResource: TNetResource;
  131.   Buf: Pointer;
  132.   Count, BufSize, Res: DWord;
  133.   Ind: Integer;
  134.   lphEnum: THandle;
  135.   Temp: TNetResourceArray;
  136.   groupname: string;
  137.   my_node: Ttreenode;
  138.   my_node_2: Ttreenode;
  139. begin
  140.   screen.Cursor := crHourGlass;
  141.   statusbar.panels[0].text := '正在列举组名...,请稍侯';
  142.   statusbar.refresh;
  143.   my_node := treeview.Selected;
  144.   groupname := treeview.Selected.Text;
  145.   FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息
  146.   NetResource.lpRemoteName := @GroupName[1]; //指定工作组名称
  147.   NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //类型为服务器(工作组)
  148.   NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
  149.   NetResource.dwScope := RESOURCETYPE_DISK; //列举文件资源信息
  150.   //获取指定工作组的网络资源句柄
  151.   Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
  152.     RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
  153.   if Res <> NO_ERROR then Exit; //执行失败
  154.   while True do //列举指定工作组的网络资源
  155.   begin
  156.     Count := $FFFFFFFF; //不限资源数目
  157.     BufSize := 8192; //缓冲区大小设置为8K
  158.     GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
  159.    //获取计算机名称
  160.     Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
  161.     if Res = ERROR_NO_MORE_ITEMS then break; //资源列举完毕
  162.     if (Res <> NO_ERROR) then Exit; //执行失败
  163.     Temp := TNetResourceArray(Buf);
  164.     for Ind := 0 to Count - 1 do //列举工作组的计算机名称
  165.     begin
  166.       //获取工作组的计算机名称,+2表示删除"\",如\wangfajun=>wangfajun
  167.       my_node_2 := treeview.Items.AddChild(my_node, Temp^.lpRemoteName + 2);
  168.       my_node_2.imageindex := 2;
  169.       Inc(Temp);
  170.     end;
  171.   end;
  172.   Res := WNetCloseEnum(lphEnum); //关闭一次列举
  173.   if Res <> NO_ERROR then exit; //执行失败
  174.   FreeMem(Buf);
  175.   screen.Cursor := crDefault;
  176.   statusbar.panels[0].text := '';
  177.   statusbar.refresh;
  178. end;
  179. //当树型目录被点击时
  180. procedure TfrmNet.TreeViewClick(Sender: TObject);
  181. begin
  182.   if treeview.Selected.Level = 0 then
  183.   begin
  184.     if treeview.Selected.count = 0 then
  185.     //添加工作组名
  186.       GetGroupName;
  187.   end;
  188.   if treeview.selected.level = 1 then
  189.   begin
  190.     if treeview.Selected.count = 0 then
  191.     //添加计算机名
  192.       GetComputerName;
  193.   end;
  194.   if treeview.Selected.level = 2 then
  195.     btnOK.Enabled := true
  196.   else
  197.     btnOK.Enabled := false
  198. end;
  199. //确定按钮,返回被选中的主机名
  200. procedure TfrmNet.btnOKClick(Sender: TObject);
  201. begin
  202.   aComputerName := treeview.Selected.Text;
  203.   close;
  204. end;
  205. procedure TfrmNet.btnCancelClick(Sender: TObject);
  206. begin
  207.   close;
  208. end;
  209. end.