不知道各位大虾看到过没有 有一种对话框 弹出的时候就只有“网络邻居”的相关内容,用户可以选择网络邻居中的任何一台PC,函数返回用户选取后的这台PC的名字,请问这个Delphi自带的函数是什么函数或者是调用什么API能够实现?谢谢各位大虾的指教

解决方案 »

  1.   

    //自己创建一个关于网络邻居的窗体unit U_NET;interfaceuses
      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;
        ImageList: TImageList;
        GroupBox1: TGroupBox;
        BtnOk: TButton;
        BtnCancel: TButton;
        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;//全局变量,存储选中的主机名 
    implementationuses main;{$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;
      

  2.   

    //获取计算机名
    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;Function GetUserResource( UserName : string ; var List : TStringList ) : Boolean;
    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 := @UserName[1];//指定计算机名称
      //获取指定计算机的网络资源句柄
      Res := WNetOpenEnum( RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONNECTABLE,
                           @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;
        End;
      Res := WNetCloseEnum(lphEnum);//关闭一次列举
      If Res <> NO_ERROR Then exit;//执行失败
      Result := True;
      FreeMem(Buf);
    End;//当树型目录被点击时
    procedure TfrmNet.TreeViewClick(Sender: TObject);
    begin
      try
      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;
      except
      end;
    end;//确定按钮,返回被选中的主机名
    procedure TfrmNet.btnOKClick(Sender: TObject);
    begin
      aComputerName := treeview.Selected.Text;
      close;
    end;procedure TfrmNet.btnCancelClick(Sender: TObject);
    begin
      close;
    end;end.