发新话题
打印

[SDK/API/系统] 【转载】收集整理的API网络函数库

【转载】收集整理的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.
妖城欢迎您!

TOP

发新话题