贴了一个以前的例子。哈哈,有一部分代码是我的!主  题:如何得到局域网内的其他机器的IP和名称?急!急!。谢谢!
作  者:Num1
所属论坛:Delphi
问题点数:51
回复次数:7
发表时间:2001-6-15 9:51:00  
  
回复贴子: 
 回复人:sundayboys(sunboy) (2001-6-15 10:06:00)  得20分 
转贴:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls ,winsock;type
  TNetResourceArray = ^TNetResource;  //网络资源类型的数组
  TForm1 = class(TForm)
    Memo1: TMemo;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    function GetIP(Sender: TObject; fcomputername:string) :string;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}                //函数GetServerList列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,
Function GetServerList( var List : TStringList ) : Boolean; //参数List中返回服务器(工作组)的名称
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;
    Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER, Nil,lphEnum);  //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
    If Res <> NO_ERROR Then
      exit;    //执行失败,退出
    Count := $FFFFFFFF;  //执行成功,开始获取整个网络中的网络类型信息
    BufSize := 8192;  //不限资源数目
    GetMem(Buf, BufSize); //缓冲区大小设置为8K
    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;
    Res:= WNetCloseEnum(lphEnum); //WNetCloseEnum关闭一个列举句柄
    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 := 1024*16;    //缓冲区大小设置为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 TForm1.GetIP(Sender: TObject; fcomputername:string) :string;
var
    WSAData: TWSAData;
    HostEnt: PHostEnt;
begin
    HostEnt := nil;
    WSAStartup(2, WSAData);
    HostEnt := gethostbyname(PChar(fComputerName));
    if HostEnt <> nil then
    begin
      with HostEnt^ do
        result:= Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]),Byte(h_addr^[3])]);
    end;
    WSACleanup;
end;procedure TForm1.Button1Click(Sender: TObject);
var
sl,s2:TstringList;
i,j,k:integer;
temp:string;
begin
  temp:='d:\computer.txt';
  memo1.lines.Clear;
  sl:=Tstringlist.create;
  s2:=Tstringlist.create;
  try
      if GetServerList(sl) then
      begin
      for i:=0 to sl.count-1 do
        begin
          memo1.lines.Add (sl.Strings[i]+':');
          try
            winexec(pchar('command.com /C net view /workgroup:'+sl.Strings[i]+' >'+temp),sw_hide);
          except
          end;
          k:=120;
          repeat;
            sleep(k);
            k:=k+40;
          until
            fileexists(temp);
          s2.LoadFromFile(temp);
          for j:=1 to s2.count-1 do
          begin
            if pos(':',s2.Strings[j]) >0 then
                memo1.lines.Add (s2.Strings[j]);
            if pos('\\',s2.Strings[j]) >0 then
                memo1.lines.Add (' '+copy(s2.Strings[j],1,15)+' IP: '+ GetIP(Sender,trim(copy(s2.Strings[j],3,20))));
            end;
      end;
      memo1.lines.Add('工作组个数:'+inttostr(sl.count));
      end
      else
      memo1.lines.Add('没有找到工作组!');
  except
  end;end;procedure TForm1.FormCreate(Sender: TObject);
begin
  memo1.lines.Clear;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  memo1.lines.SaveToFile('LKnet.spl');
  action:=cafree;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;procedure TForm1.FormShow(Sender: TObject);
begin
  IF fileexists('LKnet.spl')  then
    Memo1.Lines.LoadFromFile('LKnet.spl');
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if pos('工作组个数', memo1.Text) =0 then
    button1click(sender);
end;end. 回复人:skimwater(掠水惊鸿) (2001-6-15 10:30:00)  得5分 
没这么复杂,你用两个API函数:WnetOpenEnum ,WnetOpenResouce取得各个机器的名字,然后
用GetHostByName取得IP地址。  
 回复人:Num1(小杰) (2001-6-15 19:32:00)  得0分 
skimwater:能不能写详细点,API我不怎么会用?  
 回复人:Num1(小杰) (2001-6-15 21:45:00)  得0分  回复人:ch81() (2001-6-15 22:03:00)  得20分 
http://lijun_1.myetang.com/delphi/Delphi_14.htm
会找到你想要的。
至于IP地址,我编过:
你从上面获得的机器名,
GetHostByName(ComputeName);
上面是从机器名来获取IP。
下面是从IP来获取机器名。
并枚取出该机器共享文件夹
procedure TCrackNet.Button1Click(Sender: TObject);
var wsaData:TWSADATA;
var Info:PHostEnt;
var IP:PChar;
var i:u_long;
var HEnum:THandle;
var Net:TNetResource;
var Buffer:Array [0..19] of TNetResource;
var BufferSize:Dword;
var Count:DWORD;
var dwResult:DWORD;
var TreeNode:TTreeNode;
var TNode:TTReeNode;
var NetName:String;
var c:integer;
var PartName:String;
begin
        TreeView1.PopupMenu:=PopupMenu1;
        if WSAStartup($0101, WSAData)<>0 then
        begin
                ShowMessage('Error');
        end
        else
        begin
                if ((LoByte(WsaData.wVersion))<>1) or ((HiByte(WsaData.wVersion))<>1) then
                begin
                        WsaCleanup;
                        Exit;
                end;
        end;        //IPStr:=InttoStr(RIpEdit1.IP1Sec);
        //IPStr:=IPStr+InttoStr(RIpEdit1.IP2Sec);
        //IPStr:=IPStr+InttoStr(RIpEdit1.IP3Sec);
        //IPStr:=IPStr+InttoStr(RIpEdit1.IP4Sec);
        GetMEM(IP,Length(RIpEdit1.IPString)+1);
        StrpCopy(IP,RIpEdit1.IPString);
      // ShowMessage(RIpEdit1.IPString);
        i:=inet_Addr(IP);
        Info:=GetHostByAddr(@i,sizeof(i),AF_INET);
        if Info<>nil then
        begin
                NetName:=StrPas(Info^.h_name);
                Label1.Caption:='Now The Host is-'+NetName;
                TNode:=TreeView1.Items.AddChild(Node,NetName);
                TNode.ImageIndex:=6;
                //Node.Text:=NetName;
        end
        else
        begin
                ShowMessage('Error:'+inttostr(WsaGetLastError));
                ShowMessage('Error');
        end;
        WsaCleanUp;        Net.dwScope:=RESOURCE_GLOBALNET;
        Net.dwType:=RESOURCETYPE_ANY;
        Net.dwDisplayType:=RESOURCEDISPLAYTYPE_SERVER;
        Net.dwUsage:=RESOURCEUSAGE_CONTAINER;
        Net.lpRemoteName:=PChar('\\'+NetName);
        Net.lpComment:=nil;
        Net.lpLocalName:=nil;
        Net.lpProvider:=nil;
        //Net.lpProvider:=PChar('Microsoft Network');
        dwResult:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,PNetResource(@Net),HEnum);
        if dwResult<>NO_ERROR then
        begin
                ShowMessage('error');
                ShowMessage('MayBe The Host');
                Exit;
        end;        BufferSize:=SizeOf(Buffer);
        Count:=$FFFFFFFF;
        dwResult:=WNetEnumResource(hEnum,Count,Pointer(@Buffer),BufferSize);
        if dwResult<>NO_ERROR then
        begin
                if dwResult=ERROR_NO_MORE_ITEMS    then
                begin
                        ShowMessage('Error_No_more items');
                end;
        end;
        For c:=0 to Count-1 do
        begin
                PartName:=CutShort(StrPas(Buffer[c].lpRemoteName));
                TreeNode:=TreeView1.Items.AddChild(TNode,PartName);
                if Buffer[c].dwType=RESOURCETYPE_DISK then
                begin
                        //ShowMessage(TreeNode.Text);
                        TreeNode.ImageIndex:=7;
                        //TreeView1.Items.AddChild(Node,StrPas(Buffer.lpRemoteName));
                end;
        end;
 回复人:ybli() (2001-6-17 16:27:00)  得6分 
我用拨号方式连接到一台机器后,由于需要把共享文件夹映射为网络驱动器,但是每次启动机器时都会提示连接网络驱动器不成功,很烦,有没有办法在程序中把拨号过去的机器的共享文件夹映射为网络驱动器?最好是能在程序中自动拨号和映射网络驱动器,判断连接是否存在。  
 回复人:Num1(小杰) (2001-6-18 9:29:00)  得0分 
谢谢大家 给分了  
  

解决方案 »

  1.   

    var
    i : Integer;
    ErrCode : Integer;
    NetRes : Array[0..1023] of TNetResource;
    EnumHandle : Thandle;
    EnumEntries : Dword;
    BufferSize : Dword;
    ComputerIP,ComputerName:String;
    begin
    //try
    With NetRes[0] do begin
      dwScope :=RESOURCE_GLOBALNET;
      dwType :=RESOURCETYPE_ANY;
      dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN;
      dwUsage :=RESOURCEUSAGE_CONNECTABLE;
      lpLocalName :=NIL;
      lpRemoteName :=NIL;
      lpComment :=NIL;
      lpProvider :=NIL;
      end;
    { get net root }
    ErrCode:=WNetOpenEnum(
    RESOURCE_GLOBALNET,
    RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONTAINER,
    @NetRes[0],
    EnumHandle
    );If ErrCode=NO_ERROR then begin
      EnumEntries:=1;
      BufferSize:=SizeOf(NetRes);
      ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize);
      WNetCloseEnum(EnumHandle);
      ErrCode:=WNetOpenEnum(
      RESOURCE_GLOBALNET,
      RESOURCETYPE_ANY,
      RESOURCEUSAGE_CONNECTABLE,
      @NetRes[0],
      EnumHandle
      );
      EnumEntries:=1024;
      BufferSize:=SizeOf(NetRes);
      ErrCode:=WNetEnumResource(
      EnumHandle,
      EnumEntries,
      @NetRes,
      BufferSize
      );  for i:=0 to 1023 do
          if NetRes[i].lpRemoteName='' then Exit
          else begin
            ComputerName:=Copy(NetRes[i].lpRemoteName,3,Length(NetRes[i].lpRemoteName)-2);
            //ComputerIP:=GetIP(ComputerName);
            ShowMessage('计算机名' + NetRes[i].lpRemoteName + chr(13)
            + '计算机说明:' + NetRes[i].lpComment + chr(13)
            + 'IP地址:' + ComputerIP);
      end;
      end;
      

  2.   

    ch81(missile) ,RIpEdit1.IPString是什么,搞定一定给分!
      

  3.   

    : yangming_ok(小山羊):
    这个是我找到的一个控件,专门用于填ip地址!在《delphi第三方控件》这本书附带的光盘上有。你要吗?找出来我寄给你!要的话,留个mail
      

  4.   

    ch81(missile) ,我要。[email protected]
      

  5.   

    //动态增加树节点
    procedure TForm1.mitemAddClick(Sender: TObject);//button click
    var
      catnode :TTreeNode;
    begin
      if TreeView1.Selected = nil then
        catnode:=TreeView1.Items.Add(TTreeNode.Create(TreeView1.Items),'')
      else
      begin
        catnode := TreeView1.Items.AddChild(TreeView1.Selected,'');
        TreeView1.Selected.Expand(true);
      end;
      
      TreeView1.Selected := catnode;
      //When EditText is called, the tree view's OnEditing event is triggered
      catnode.EditText ;
    end;// 因此请调用treeview1的 OnEdited Event
    procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
      var S: String);//S is just your m.
    begin
      showmessage(s);
    end;
      

  6.   

    : yangming_ok(小山羊) :ripedit寄给你了!
      

  7.   

     Const
        cTreeCodeFormat = '122222'; //编码格式: x xx xx xx xx xx
        cTreeMaxLevel = 6;
        cTreeRootTxt = '单位字典';
    function TForm1.GetNodeLevel(sFormat,sCode:string):integer;
    var
      i,level,iLen:integer;
    begin
      level := -1;
      iLen := 0;
      if (sFormat<>'') and (sCode<>'') then
        for i:= 1 to Length(sFormat) do  //分析编码格式,找出当前代码层次
        begin
          iLen := iLen + StrToInt(sFormat[i]);
          if Length(sCode) = iLen then
          begin
            level := i;
            break;
          end;
        end;
      Result := level;
    end;
      

  8.   

    //初始化树
    Procedure TForm1.LoadTree(treeDb:TDataSet;sTableName,sSortField:string);
    var
      curId,nodeTxt:string;
      level,chindex,cnode,num:integer;
      mynode:array[0..6] of TTreeNode;
    begin
      Screen.Cursor := crHourGlass;
      TreeView1.Enabled := True;
      TreeView1.Items.Clear ;
      Level := 0;
      num := 1;
      TreeView1.Items.Clear;
      //设置根节点
      myNode[Level] := TreeView1.Items.Add(TreeView1.TopItem,cTreeRootTxt);
      myNode[Level].ImageIndex := 1;
      //遍历数据表,利用编码字段记录排序规,依次添加数节点
      With TQuery(treeDb) do
      begin
       try
          Close;
          SQL.Clear ;
          SQL.Add(Format('Select * from  %s order by %s ',[sTableName,sSortField]));
          Open;
          First;
          
      

  9.   

    While not Eof do
          begin
            curId := Trim(FieldByName('dwbm').Asstring);
            nodeTxt :=  curId+'-'+Trim(FieldByName('dwqc').Asstring);
            //这里返回代码的层次数
            Level := GetNodeLevel('122222',curId);
            if Level > 0 then
            begin
            //增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系
            //注意:这里的父节点是用当前节点的上一级节点 myNode[Level-1]
              mynode[Level] := TreeView1.Items.AddChild(myNode[Level-1],nodeTxt);
              mynode[Level].ImageIndex := 2;
            end;
            Next;
            if Eof  then
            begin
              showmessage('eof');
              First;
              Screen.Cursor := crHourGlass;
                 showmessage('end');
              exit ;
            end;
          end;
        finally
          close;
        end;
        myNode[0].Expand (False);
        Screen.Cursor := crHourGlass;
      end;
    end;