【转载】收集整理的API网络函数库
{============================
功 能:网络函数库
时 间:2002/10/02
版 本:1.0
备 注:没有事情干,抄抄写写整理了一些网络函数供大家使用。
希望大家能继续补充
============================}
unit netFunc;
interface
uses
SysUtils, Windows, Dialogs, WinSock, Classes, ComObj, WinInet, Variants;
//错误信息常量
const
C_Err_GetLocalIp ='获取本地ip失败';
C_Err_GetNameByIpAddr ='获取主机名失败';
C_Err_GetSQLServerList='获取SQLServer服务器失败';
C_Err_GetUserResource ='获取共享资失败';
C_Err_GetGroupList ='获取所有工作组失败';
C_Err_GetGroupUsers ='获取工作组中所有计算机失败';
C_Err_GetNetList ='获取所有网络类型失败';
C_Err_CheckNet ='网络不通';
C_Err_CheckAttachNet ='未登入网络';
C_Err_InternetConnected ='没有上网';
C_Txt_CheckNetSuccess ='网络畅通';
C_Txt_CheckAttachNetSuccess='已登入网络';
C_Txt_InternetConnected ='上网了';
//得到本机的局域网Ip地址
Function GetLocalIp(var LocalIp:string):Boolean;
//通过Ip返回机器名
Function GetNameByIPAddr(IPAddr:string; var MacName:string):Boolean ;
//获取网络中SQLServer列表
Function GetSQLServerList(var List:Tstringlist):Boolean;
//获取网络中的所有网络类型
Function GetNetList(var List:Tstringlist):Boolean;
//获取网络中的工作组
Function GetGroupList(var List:TStringList):Boolean;
//获取工作组中所有计算机
Function GetUsers(GroupName:string; var List:TStringList):Boolean;
//获取网络中的资源
Function GetUserResource(IpAddr:string; var List:TStringList):Boolean;
//映射网络驱动器
Function NetAddConnection(NetPath:Pchar; PassWord:Pchar;LocalPath:Pchar):Boolean;
//检测网络状态
Function CheckNet(IpAddr:string):Boolean;
//检测机器是否登入网络
Function CheckMacAttachNet:Boolean;
//判断Ip协议有没有安装 这个函数有问题
Function IsIPInstalled :boolean;
//检测机器是否上网
Function InternetConnected:Boolean;
//关闭网络连接
function NetCloseAll:boolean;
implementation
{====================
功 能:检测机器是否登入网络
参 数:无
返回值:成功:True 失败:False
备 注:
版 本:
1.0 2002/10/03 09:55:00
====================}
Function CheckMacAttachNet:Boolean;
begin
Result:=False;
if(GetSystemMetrics(SM_NETWORK)<>0)then
Result:=True;
end;
{====================
功 能:返回本机的局域网Ip地址
参 数:无
返回值:成功:True,并填充LocalIp 失败:False
备 注:
版 本:
1.0 2002/10/02 21:05:00
====================}
function GetLocalIP(var LocalIp:string):Boolean;
var
HostEnt:PHostEnt;
Ip:string;
addr:pchar;
Buffer:array [0..63] of char;
GInitData:TWSADATA;
begin
Result:=False;
try
WSAStartup(2,GInitData);
GetHostName(Buffer,SizeOf(Buffer));
HostEnt:=GetHostByName(buffer);
if(HostEnt=nil)then Exit;
addr:=HostEnt^.h_addr_list^;
ip:=Format('%d.%d.%d.%d',[byte(addr [0]),
byte(addr [1]),byte(addr [2]),byte(addr [3])]);
LocalIp:=Ip;
Result:=True;
finally
WSACleanup;
end;
end;
{====================
功 能:通过Ip返回机器名
参 数:
IpAddr:想要得到名字的Ip
返回值:成功:机器名 失败:''
备 注:
inet_addr function converts a string containing an Internet
Protocol dotted address into an in_addr.
版 本:
1.0 2002/10/02 22:09:00
====================}
function GetNameByIPAddr(IPAddr :String;var MacName:String):Boolean;
var
SockAddrIn:TSockAddrIn;
HostEnt:PHostEnt;
WSAData:TWSAData;
begin
Result:=False;
if(IpAddr='')then exit;
try
WSAStartup(2,WSAData);
SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(IPAddr));
HostEnt:=gethostbyaddr(@SockAddrIn.sin_addr.S_addr,4,AF_INET);
if(HostEnt<>nil)then
MacName:=StrPas(Hostent^.h_name);
Result:=True;
finally
WSACleanup;
end;
end;
{====================
功 能:返回网络中SQLServer列表
参 数:
List:需要填充的List
返回值:成功:True,并填充List 失败 False
备 注:
版 本:
1.0 2002/10/02 22:44:00
====================}
Function GetSQLServerList(var List:Tstringlist):boolean;
var
i:integer;
sRetValue:String;
SQLServer:Variant;
ServerList:Variant;
begin
Result:=False;
List.Clear;
try
SQLServer:=CreateOleObject('SQLDMO.Application');
ServerList:=SQLServer.ListAvailableSQLServers;
for i:=1 to Serverlist.Count do
list.Add(Serverlist.item(i));
Result:=True;
Finally
SQLServer:=NULL;
ServerList:=NULL;
end;
end;
{====================
功 能:判断Ip协议有没有安装
参 数:无
返回值:成功:True 失败:False;
备 注: 该函数还有问题
版 本:
1.0 2002/10/02 21:05:00
====================}
Function IsIPInstalled :boolean;
var
WSData:TWSAData;
ProtoEnt:PProtoEnt;
begin
Result:=True;
try
if(WSAStartup(2,WSData)= 0)then
begin
ProtoEnt:=GetProtoByName('IP');
if(ProtoEnt=nil)then
Result:=False
end;
finally
WSACleanup;
end;
end;
{====================
功 能:返回网络中的共享资源
参 数:
IpAddr:机器Ip
List:需要填充的List
返回值:成功:True,并填充List 失败:False;
备 注:
WNetOpenEnum function starts an enumeration of network
resources or existing connections.
WNetEnumResource function continues a network-resource
enumeration started by the WNetOpenEnum function.
版 本:
1.0 2002/10/03 07:30:00
====================}
Function GetUserResource(IpAddr:string; var List:TStringList):Boolean;
type
TNetResourceArray=^TNetResource;//网络类型的数组
Var
i:Integer;
Buf:Pointer;
Temp:TNetResourceArray;
lphEnum:THandle;
NetResource:TNetResource;
Count,BufSize,Res:DWord;
Begin
Result:=False;
List.Clear;
if(copy(Ipaddr,0,2)<>'\')then
IpAddr:='\'+IpAddr; //填充Ip地址信息
FillChar(NetResource,SizeOf(NetResource),0);//初始化网络层次信息
NetResource.lpRemoteName:=@IpAddr[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 i:=0 to Count-1 do
begin
//获取指定计算机中的共享资源名称,+2表示删除"\",
//如2.168.0.1 => 192.168.0.1
List.Add(Temp^.lpRemoteName+2);
Inc(Temp);
end;
end;
Res:=WNetCloseEnum(lphEnum);//关闭一次列举
if(Res<>NO_ERROR)then exit;//执行失败
Result:=True;
FreeMem(Buf);
End;
{====================
功 能:返回网络中的工作组
参 数:
List:需要填充的List
返回值:成功:True,并填充List 失败:False;
备 注:
版 本:
1.0 2002/10/03 08:00:00
====================}
Function GetGroupList(var List :TStringList):Boolean;
type
TNetResourceArray=^TNetResource;//网络类型的数组
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;
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
Res:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER,Nil,lphEnum);
if(Res<>NO_ERROR)then exit;//Raise Exception(Res);//执行失败
//获取整个网络中的网络类型信息
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;
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
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;
{====================
功 能:列举工作组中所有的计算机
参 数:
List:需要填充的List
返回值:成功:True,并填充List 失败:False;
备 注:
版 本:
1.0 2002/10/03 08:00:00
====================}
Function GetUsers(GroupName:string; var List:TStringList):Boolean;
type
TNetResourceArray=^TNetResource;//网络类型的数组
Var
i:Integer;
Buf:Pointer;
Temp:TNetResourceArray;
lphEnum:THandle;
NetResource:TNetResource;
Count,BufSize,Res:DWord;
begin
Result:=False;
List.Clear;
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 i:=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;
{====================
功 能:列举所有网络类型
参 数:
List:需要填充的List
返回值:成功:True,并填充List 失败:False;
备 注:
版 本:
1.0 2002/10/03 08:54:00
====================}
Function GetNetList(var List:Tstringlist):Boolean;
type
TNetResourceArray=^TNetResource;//网络类型的数组
Var
p:TNetResourceArray;
Buf:Pointer;
i:SmallInt;
lphEnum:THandle;
NetResource:TNetResource;
Count,BufSize,Res:DWORD;
begin
Result:=False;
List.Clear;
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
List.Add(p^.lpRemoteName);
Inc(P);
end;
Res:=WNetCloseEnum(lphEnum); //关闭一次列举
if(Res<>NO_ERROR)then exit; //执行失败
Result:=True;
FreeMem(Buf); //释放内存
end;
{====================
功 能:映射网络驱动器
参 数:
NetPath:想要映射的网络路径
Password:访问密码
Localpath 本地路径
返回值:成功:True 失败:False;
备 注:
版 本:
1.0 2002/10/03 09:24:00
====================}
Function NetAddConnection(NetPath:Pchar; PassWord:Pchar;
LocalPath:Pchar):Boolean;
var
Res:Dword;
begin
Result:=False;
Res:=WNetAddConnection(NetPath,Password,LocalPath);
if(Res<>No_Error)then exit;
Result:=True;
end;
{====================
功 能:检测网络状态
参 数:
IpAddr:被测试网络上主机的IP地址或名称,建议使用Ip
返回值:成功:True 失败:False;
备 注:
版 本:
1.0 2002/10/03 09:40:00
====================}
Function CheckNet(IpAddr:string):Boolean;
type
PIPOptionInformation=^TIPOptionInformation;
TIPOptionInformation=packed record
TTL: Byte; // Time To Live(used for traceroute)
TOS: Byte; // Type Of Service(usually 0)
Flags: Byte; // IP header flags(usually 0)
OptionsSize:Byte; // Size of options data(usually 0,max 40)
OptionsData:PChar; // Options data buffer
end;
PIcmpEchoReply=^TIcmpEchoReply;
TIcmpEchoReply=packed record
Address: DWord; // replying address
Status: DWord; // IP status value(see below)
RTT: DWord; // Round Trip Time in milliseconds
DataSize: Word; // reply data size
Reserved: Word;
Data: Pointer; // pointer to reply data buffer
Options: TIPOptionInformation; // reply options
end;
TIcmpCreateFile=function:THandle; stdcall;
TIcmpCloseHandle=function(IcmpHandle:THandle):Boolean; stdcall;
TIcmpSendEcho=function(
IcmpHandle: THandle;
DestinationAddress:DWord;
RequestData: Pointer;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Pointer;
ReplySize: DWord;
Timeout: DWord
):DWord; stdcall;
const
Size=32;
TimeOut=1000;
var
wsadata:TWSAData;
Address:DWord; // Address of host to contact
HostName,HostIP:String; // Name and dotted IP of host to contact
Phe:PHostEnt; // HostEntry buffer for name lookup
BufferSize,nPkts:Integer;
pReqData,pData:Pointer;
pIPE:PIcmpEchoReply; // ICMP Echo reply buffer
IPOpt:TIPOptionInformation; // IP Options for packet to send
const
IcmpDLL='icmp.dll';
var
hICMPlib:HModule;
IcmpCreateFile :TIcmpCreateFile;
IcmpCloseHandle:TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
hICMP:THandle; // Handle for the ICMP Calls
begin
// initialise winsock
Result:=True;
if(WSAStartup(2,wsadata)<>0)then begin
Result:=False;
halt;
end;
// register the icmp.dll stuff
hICMPlib:=loadlibrary(icmpDLL);
if(hICMPlib<>null)then begin
@ICMPCreateFile:=GetProcAddress(hICMPlib,'IcmpCreateFile');
@IcmpCloseHandle:= GetProcAddress(hICMPlib,'IcmpCloseHandle');
@IcmpSendEcho:= GetProcAddress(hICMPlib,'IcmpSendEcho');
if(@ICMPCreateFile=Nil)or(@IcmpCloseHandle=Nil)or(@IcmpSendEcho=Nil)then begin
Result:=False;
halt;
end;
hICMP:=IcmpCreateFile;
if(hICMP=INVALID_HANDLE_VALUE)then begin
Result:=False;
halt;
end;
end else begin
Result:=False;
halt;
end;
// --------------------
Address:=inet_addr(PChar(IpAddr));
if(Address=INADDR_NONE)then begin
Phe:=GetHostByName(PChar(IpAddr));
if(Phe=Nil)then Result:=False
else begin
Address:=longint(plongint(Phe^.h_addr_list^)^);
HostName:=Phe^.h_name;
HostIP:=StrPas(inet_ntoa(TInAddr(Address)));
end;
end
else begin
Phe:=GetHostByAddr(@Address,4,PF_INET);
if(Phe=Nil)then Result:=False;
end;
if(Address=INADDR_NONE)then
begin
Result:=False;
end;
// Get some data buffer space and put something in the packet to send
BufferSize:=SizeOf(TICMPEchoReply)+Size;
GetMem(pReqData,Size);
GetMem(pData,Size);
GetMem(pIPE,BufferSize);
FillChar(pReqData^,Size,$AA);
pIPE^.Data:=pData;
// Finally Send the packet
FillChar(IPOpt,SizeOf(IPOpt),0);
IPOpt.TTL:=64;
NPkts:=IcmpSendEcho(hICMP,Address,pReqData,Size,
@IPOpt,pIPE,BufferSize,TimeOut);
if(NPkts=0)then Result:=False;
// Free those buffers
FreeMem(pIPE); FreeMem(pData); FreeMem(pReqData);
// --------------------
IcmpCloseHandle(hICMP);
FreeLibrary(hICMPlib);
// free winsock
if(WSACleanup<>0)then Result:=False;
end;
{====================
功 能:检测计算机是否上网
参 数:无
返回值:成功:True 失败:False;
备 注: uses Wininet
版 本:
1.0 2002/10/07 13:33:00
====================}
function InternetConnected:Boolean;
const
// local system uses a modem to connect to the Internet.
INTERNET_CONNECTION_MODEM =1;
// local system uses a local area network to connect to the Internet.
INTERNET_CONNECTION_LAN =2;
// local system uses a proxy server to connect to the Internet.
INTERNET_CONNECTION_PROXY =4;
// local system's modem is busy with a non-Internet connection.
INTERNET_CONNECTION_MODEM_BUSY=8;
var
dwConnectionTypes :DWORD;
begin
dwConnectionTypes:=INTERNET_CONNECTION_MODEM+INTERNET_CONNECTION_LAN
+INTERNET_CONNECTION_PROXY;
Result:=InternetGetConnectedState(@dwConnectionTypes,0);
end;
//关闭网络连接
function NetCloseAll:boolean;
const
NETBUFF_SIZE=8;
type
NET_API_STATUS=DWORD;
LPByte=PByte;
var
dwNetRet :DWORD;
i :integer;
dwEntries :DWORD;
dwTotalEntries :DWORD;
szClient :LPWSTR;
dwUserName :DWORD;
Buff :array[0..NETBUFF_SIZE-1]of byte;
Adword :array[0..NETBUFF_SIZE div 4-1] of dword;
NetSessionEnum:function(ServerName:LPSTR;
Reserved:DWORD;
Buf:LPByte;
BufLen:DWORD;
ConnectionCount:LPDWORD;
ConnectionToltalCount:LPDWORD):NET_API_STATUS;
stdcall;
NetSessionDel:function (ServerName:LPWSTR;
UncClientName:LPWSTR ;
UserName:dword):NET_API_STATUS;
stdcall;
LibHandle :THandle;
begin
Result:=false;
try
{ 加载 DLL }
LibHandle:=LoadLibrary('svrapi.dll');
try
{ 如果加载失败,LibHandle=0.}
if(LibHandle=0)then
raise Exception.Create('不能加载SVRAPI.DLL');
{ DLL 加载成功,取得到 DLL 输出函数的连接然后调用 }
@NetSessionEnum:=GetProcAddress(LibHandle,'NetSessionEnum');
@NetSessionDel:=GetProcAddress(LibHandle,'NetSessionDel');
if(@NetSessionEnum=nil)or(@NetSessionDel=nil)then
RaiseLastWin32Error { 连接函数失败 }
else
begin
dwNetRet:=NetSessionEnum(nil,,@Buff,
NETBUFF_SIZE,@dwEntries,
@dwTotalEntries);
if(dwNetRet=0)then
begin
Result:=true;
for i:=0 to dwTotalEntries-1 do
begin
Move(Buff,Adword,NETBUFF_SIZE);
szClient:=LPWSTR(Adword[0]);
dwUserName:=Adword[2];
dwNetRet:=NetSessionDel(nil,szClient,dwUserName);
if(dwNetRet<>0)then
begin
Result:=false;
break;
end;
Move(Buff[26],Buff[0],NETBUFF_SIZE-(i+1)*26);
end
end
else
Result:=false;
end;
finally
FreeLibrary(LibHandle); // Unload the DLL.
end;
except
end;
end;
end.