---- 一、先解釋一些要用到的數(shù)據(jù)常量和數(shù)據(jù)結(jié)構(gòu)。
constRAS_MaxDeviceType = 16;//設(shè)備類型名稱長(zhǎng)度RAS_MaxEntryName = 256;//連接名稱最大長(zhǎng)度RAS_MaxDeviceName = 128;//設(shè)備名稱最大長(zhǎng)度RAS_MaxIpAddress = 15;//IP地址的最大長(zhǎng)度Rasp_PppIp = $8021;//撥號(hào)連接的協(xié)議類型,該數(shù)值表示PPP連接typeHRASCONN = DWord;//撥號(hào)連接句柄的類型RASCONN = record//活動(dòng)的撥號(hào)連接的句柄和設(shè)置信息dwSize : DWORD;//該結(jié)構(gòu)所占內(nèi)存的大小(Bytes), 一般設(shè)置為SizeOf(RASCONN) hrasconn : HRASCONN;//活動(dòng)連接的句柄szEntryName : array[0..RAS_MaxEntryName] of char; //活動(dòng)連接的名稱szDeviceType : array[0..RAS_MaxDeviceType] of char;//活動(dòng)連接的所用的設(shè)備類型szDeviceName : array[0..RAS_MaxDeviceName] of char;//活動(dòng)連接的所用的設(shè)備名稱end;TRASPPPIP = record//活動(dòng)的撥號(hào)連接的動(dòng)態(tài)IP地址信息dwSize : DWORD;//該結(jié)構(gòu)所占內(nèi)存的大小(Bytes),一般設(shè)置為SizeOf(TRASPPPIP) dwError : DWORD;//錯(cuò)誤類型標(biāo)識(shí)符szIpAddress : array[ 0..RAS_MaxIpAddress ] of char;//活動(dòng)的撥號(hào)連接的IP地址end;
---- 二、接著要解釋要用到的兩個(gè)RAS函數(shù)。
//獲取所有活動(dòng)的撥號(hào)連接的信息(連接句柄和設(shè)置信息)function RasEnumConnections( var lPRasconn : RASCONN ;//接收活動(dòng)連接的緩沖區(qū)的指針 var lpcb: DWORD;//緩沖區(qū)大小 var lpcConnections : DWORD//實(shí)際的活動(dòng)連接數(shù) ) : DWORD; stdcall;function RasEnumConnections;external 'Rasapi32.dll' name 'RasEnumConnectionsA';//獲取指定活動(dòng)的撥號(hào)連接的動(dòng)態(tài)IP信息function RasGetProjectionInfo( hrasconn : HRasConn;//指定活動(dòng)連接的句柄 rasprojection : DWORD;//RAS連接類型 var lpprojection : TRASPPPIP;//接收動(dòng)態(tài)IP信息的緩沖區(qū) var lpcb : DWord//接收緩沖區(qū)的大小 ) : DWORD;stdcall;function RasGetProjectionInfo;external 'Rasapi32.dll' name 'RasGetProjectionInfoA';
這兩個(gè)函數(shù)的返回值為0時(shí)表示執(zhí)行成功,非0表示錯(cuò)誤代碼。
---- 三、下面要討論如何用上面的兩個(gè)RAS函數(shù)獲取撥號(hào)連接的動(dòng)態(tài)IP地址
---- 首先,要用函數(shù)RasEnumConnections列出已建立的活動(dòng)撥號(hào)連接的信息,其中包括連接名稱、連接句柄、連接設(shè)備類型和設(shè)備名稱;然后根據(jù)連接句柄用函數(shù)RasGetProjectionInfo獲取連接對(duì)應(yīng)的一個(gè)TRASPPPIP結(jié)構(gòu),其中包括一個(gè)成員屬性szIpAddress即為動(dòng)態(tài)IP地址。具體請(qǐng)參見以下程序片段和注釋信息。
procedure TForm1.Button1Click(Sender: TObject);const MaxConnections = 10;//假設(shè)最多有10個(gè)活動(dòng)的撥號(hào)連接var connections : array[0..MaxConnections-1] of RASCONN; //撥號(hào)連接數(shù)組 longSize : dword; intAvailabelConnections : dword; //活動(dòng)的撥號(hào)連接的實(shí)際數(shù)目 intIndex : integer; strTemp : string; dwResult : DWORD; dwSize : DWORD; RASpppIP : TRASPPPIP;//活動(dòng)的撥號(hào)連接的動(dòng)態(tài)IP地址信息begin connections[ 0 ].dwSize := sizeof(RASCONN); longSize := MaxConnections * connections[ 0 ].dwSize;//接收活動(dòng)連接的緩沖區(qū)大小 intAvailabelConnections := 0; //獲取所有活動(dòng)的撥號(hào)連接的信息(連接句柄和設(shè)置信息) dwResult := RasEnumConnections( connections[ 0 ], longSize,intAvailabelConnections ); if 0 < > dwResult then memo1.lines.add( '錯(cuò)誤:' + inttostr( dwResult ) ) else begin memo1.lines.add( '現(xiàn)有的活動(dòng)連接有' + IntToStr( intAvailabelConnections ) + '個(gè)');//顯示所有活動(dòng)的撥號(hào)連接的信息(設(shè)置信息和動(dòng)態(tài)IP地址) for intIndex := 0 to intAvailabelConnections - 1 do begin//顯示一個(gè)活動(dòng)的撥號(hào)連接的設(shè)置信息 strTemp := '連接名稱:' + StrPAS( connections[ intIndex ].szEntryName ) + ',設(shè)備類型:' + StrPAS( connections[ intIndex ].szDeviceType ) + ',設(shè)備名稱:' + StrPAS( connections[ intIndex ].szDeviceName ); memo1.lines.add( strTemp ); //顯示一個(gè)活動(dòng)的撥號(hào)連接的動(dòng)態(tài)IP地址 dwSize := SizeOf(RASpppIP); RASpppIP.dwSize := dwSize; dwResult := RASGetProjectionInfo( connections[ intIndex ].hRasConn,RASP_PppIp,RasPPPIP,dwSize);//獲取動(dòng)態(tài)IP地址 if 0 < > dwResult then memo1.lines.add('錯(cuò)誤:' + inttostr( dwResult )) else memo1.lines.add( '動(dòng)態(tài)地址:' + StrPas(RASpppIP.szIPAddress)); end; end;end;新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注