编写程序自动获取局域网中全部机器的ip地址,自动生成网络图
考虑,通过ip广播,获取返回ip地址,但是程序不会写,望指教!
考虑,通过ip广播,获取返回ip地址,但是程序不会写,望指教!
解决方案 »
- 请教 DBGRIDEH 数字排序问题
- 如何获取这个网页所链接的数据?
- 今天去面试了,郁闷……
- 关于发送HTML格式邮件时的内涵图片的发送问题
- 文件读取和处理字符串的效率问题
- 请如能实现如下功能的代码!通过读取数据库中的记录,得到如下的Treeview树。
- 如何编写activexform时候实现类似ado.recordset这样的属性
- 急问!!怎样对数据库进行设置才能在网络上运行我的程序?
- 请问在DELPHI中有何控件或者方法用来执行SQL SERVER的脚本文件(.SQL)
- InstallShield Professional - Standard Edition --- IPSE622.exe 序列号
- TDateTimePicker的时间与当前时间的比较
- 数据库表的问题,谢谢了
以前公司做過, 但無法提供代碼
不要代码也行,我就是有一个设备的ip地址不知道,现在最着急的是找出她的ip地址
不过也想写一个这个东东,免得以后麻烦,如果好用的话就和大家共享,呵呵
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Winsock, Sockets, ComCtrls, Buttons,shellapi,ComObj,WinInet;type
TForm1 = class(TForm)
TreeView1: TTreeView;
TreeView2: TTreeView;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
function GetLocalName():string;
function GetLocalIP(aname:string):string;
procedure GetComputerInGroupName();
procedure GetGroupName();
procedure TreeView1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure TreeView2Click(Sender: TObject);
private
{ Private declarations }
public { Public declarations }
end;
type
TNetResourceArray = ^TNetResource;//网络类型的数组var
Form1: TForm1;
strr:string;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
GetGroupName();
end; function tform1.GetLocalIP (aname:string):string; //»ñÈ¡±¾µØipµØÖ·£»
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;begin
WSAStartup($101, GInitData);
Result := '';
StrPCopy(Buffer, AName);
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^[I] <> nil do
begin
result:=StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;function tform1.GetLocalName ():string;//»ñÈ¡±¾µØÖ÷»úÃû£»
var
pComputerName:pchar ;
ComputerNameLen:longword;
begin
ComputerNameLen:=255;
GetMem(pComputerName,ComputerNameLen);
try
if not GetComputerName(pComputerName,ComputerNameLen) then
pComputerName:='No computer name';
result:=pComputerName;
finally
FreeMem(pComputerName);
End;
end;procedure tform1.GetGroupName();
var
NetResource: TNetResource;
Buf: Pointer;
Node: TtreeNode;
Count, BufSize, Res: DWORD;
lphEnum: THandle;
p: TNetResourceArray;
i, j: SmallInt;
NetworkTypeList: TList;
my_node_1: Ttreenode;
begin
screen.Cursor := crHourGlass;
Node :=TreeView1.Selected;
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 := treeview1.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;
end;//获取计算机名
procedure tform1.GetComputerInGroupName();
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;
my_node := treeview2.Selected;
groupname:= treeview1.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 := treeview2.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;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
begin
TreeView2.Items.Clear;
GetComputerInGroupName();
end;procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;procedure TForm1.TreeView2Click(Sender: TObject);
begin
edit1.Text:=GetLocalIP(TreeView2.Selected.Text)
end;end.