線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4263
推到 Plurk!
推到 Facebook!

網路函數大公開

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-26 15:37:42 IP:61.64.xxx.xxx 未訂閱
此為轉貼資料 網路函數大公開(摘自zsy_good原作,本人作了修改整理) 作者:zsy_good (http://www.tommstudio.com/newclub30/) -------------------------------------------------------------------------------- 聲明:本文摘自CSDN論壇上網友zsy_good的原作,經過了tomm的一些整理修改. {========================================================================= 功 能: 網路函數庫 時 間: 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表示刪除"\\", //如\\192.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=$208; 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,$32, @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. 這個unit的下載在本站原碼天地. ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-04 3:41:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!