U_NET.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:7k
- unit U_NET;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, Buttons, ComCtrls, ExtCtrls, ImgList;
- type
- TNetResourceArray = ^TnetResource;
- TfrmNet = class(TForm)
- StatusBar: TStatusBar;
- Panel1: TPanel;
- TreeView: TTreeView;
- Panel2: TPanel;
- btnOK: TSpeedButton;
- btnCancel: TSpeedButton;
- ImageList: TImageList;
- procedure FormActivate(Sender: TObject);
- procedure TreeViewClick(Sender: TObject);
- procedure btnOKClick(Sender: TObject);
- procedure btnCancelClick(Sender: TObject);
- private
- procedure GetComputerName; //获取计算机名
- procedure GetGroupName; //获取组名
- { Private declarations }
- public
- { Public declarations }
- end;
-
- //打开窗体,并返回选定的计算机名。
- function NetExecute(aFormClass: TFormClass): string;
- var
- frmNet: TfrmNet;
- node: Ttreenode;
- aComputerName : string;//全局变量,存储选中的主机名
- implementation
- {$R *.DFM}
- //打开窗体,并返回选定的计算机名。
- function NetExecute(aFormClass: TFormClass): string;
- begin
- aComputerName := '';
- with aFormClass.Create(Application) do
- begin
- try
- showModal;
- finally
- free;
- end;
- result := aComputerName;
- end;
- end;
- procedure TfrmNet.FormActivate(Sender: TObject);
- begin
- node := treeview.Items.add(Treeview.topitem, '整个网络');
- node.imageindex := 0;
- treeview.SetFocus;
- end;
- //获取组名
- procedure TfrmNet.GetGroupName;
- var
- NetResource: TNetResource;
- Buf: Pointer;
- Count, BufSize, Res: DWORD;
- lphEnum: THandle;
- p: TNetResourceArray;
- i, j: SmallInt;
- NetworkTypeList: TList;
- my_node_1: Ttreenode;
- begin
- statusbar.panels[0].text := '正在列举域名...,请稍侯';
- statusbar.refresh;
- screen.Cursor := crHourGlass;
- NetworkTypeList := TList.Create;
- //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
- Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
- RESOURCEUSAGE_CONTAINER, nil, lphEnum);
- if Res <> NO_ERROR then exit; //执行失败
- //获取整个网络中的网络类型信息
- 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
- my_node_1 := treeview.Items.addchild(node, StrPAS(P^.lpRemoteName)); //取得一个工作组的名称
- my_node_1.imageindex := 1;
- Inc(P);
- end;
- end;
- Res := WNetCloseEnum(lphEnum); //关闭一次列举
- if Res <> NO_ERROR then break; //执行失败
- end;
- FreeMem(Buf);
- NetworkTypeList.Destroy;
- screen.Cursor := crDefault;
- statusbar.panels[0].text := '';
- statusbar.refresh;
- end;
- //获取计算机名
- procedure TfrmNet.GetComputerName;
- var
- NetResource: TNetResource;
- Buf: Pointer;
- Count, BufSize, Res: DWord;
- Ind: Integer;
- lphEnum: THandle;
- Temp: TNetResourceArray;
- groupname: string;
- my_node: Ttreenode;
- my_node_2: Ttreenode;
- begin
- screen.Cursor := crHourGlass;
- statusbar.panels[0].text := '正在列举组名...,请稍侯';
- statusbar.refresh;
- my_node := treeview.Selected;
- groupname := treeview.Selected.Text;
- 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
- my_node_2 := treeview.Items.AddChild(my_node, Temp^.lpRemoteName + 2);
- my_node_2.imageindex := 2;
- Inc(Temp);
- end;
- end;
- Res := WNetCloseEnum(lphEnum); //关闭一次列举
- if Res <> NO_ERROR then exit; //执行失败
- FreeMem(Buf);
- screen.Cursor := crDefault;
- statusbar.panels[0].text := '';
- statusbar.refresh;
- end;
- //当树型目录被点击时
- procedure TfrmNet.TreeViewClick(Sender: TObject);
- begin
- if treeview.Selected.Level = 0 then
- begin
- if treeview.Selected.count = 0 then
- //添加工作组名
- GetGroupName;
- end;
- if treeview.selected.level = 1 then
- begin
- if treeview.Selected.count = 0 then
- //添加计算机名
- GetComputerName;
- end;
- if treeview.Selected.level = 2 then
- btnOK.Enabled := true
- else
- btnOK.Enabled := false
- end;
- //确定按钮,返回被选中的主机名
- procedure TfrmNet.btnOKClick(Sender: TObject);
- begin
- aComputerName := treeview.Selected.Text;
- close;
- end;
- procedure TfrmNet.btnCancelClick(Sender: TObject);
- begin
- close;
- end;
- end.