談用Delphi程式獲取撥號連線的動態IP地址 (轉)

worldblog發表於2007-12-07
談用Delphi程式獲取撥號連線的動態IP地址 (轉)[@more@]在下,如果了撥號,則在的系統目錄System下將有兩個撥號庫Ras32.DLL和RasApi16.DLL,我們可利用其中的RAS系列來獲取和設定撥號連線網路的資訊。當然是可以獲取撥號連線的動態了。在幫助中,有相關RAS函式的詳細說明。

---- 一、先解釋一些要用到的資料常量和資料結構。

const RAS_MaxDeviceType = 16;//裝置型別名稱長度 RAS_MaxEntryName = 256;//連線名稱最大長度 RAS_MaxDeviceName = 128;//裝置名稱最大長度 RAS_MaxIpAddress = 15;//IP地址的最大長度 R_Ppp= $8021;//撥號連線的型別,該數值表示PPP連線 type HRANN = D;//撥號連線控制程式碼的型別 RASCONN = record//活動的撥號連線的控制程式碼和設定資訊 dwSize : DWORD;//該結構所佔的大小(Bytes), 一般設定為SizeOf(RASCONN) hrasconn : HRASCONN;//活動連線的控制程式碼 szEntryName : array[0..RAS_MaxEntryName] of char; //活動連線的名稱 szDeviceType : array[0..RAS_MaxDeviceType] of char; //活動連線的所用的裝置型別 szDeviceName : array[0..RAS_MaxDeviceName] of char; //活動連線的所用的裝置名稱 end; TRASPPPIP = record//活動的撥號連線的動態IP地址資訊 dwSize : DWORD;//該結構所佔記憶體的大小(Bytes), 一般設定為SizeOf(TRASPPPIP) dwError : DWORD;//錯誤型別識別符號 szIpAddress : array[ 0..RAS_MaxIpAddress ] of char; //活動的撥號連線的IP地址 end;


---- 二、接著要解釋要用到的兩個RAS函式。

//獲取所有活動的撥號連線的資訊(連線控制程式碼和設定資訊) function RasEnumConnections( var lprasconn : RASCONN ; //接收活動連線的緩衝區的指標 var lpcb: DWORD;//緩衝區大小 var lpcConnections : DWORD//實際的活動連線數 ) : DWORD; stdcall; function RasEnumConnections;external 'Rasapi32.dll' name 'RasEnumConnectionsA'; //獲取指定活動的撥號連線的動態IP資訊 function RasGetProjectionInfo( hrasconn : HRasConn;//指定活動連線的控制程式碼 rasprojection : DWORD;//RAS連線型別 var lpprojection : TRASPPPIP;//接收動態IP資訊的緩衝區 var lpcb : DWord//接收緩衝區的大小 ) : DWORD;stdcall; function RasGetProjectionInfo;external 'Rasapi32.dll' name 'RasGetProjectionInfoA';


  這兩個函式的返回值為0時表示成功,非0表示錯誤程式碼。

---- 三、下面要討論如何用上面的兩個RAS函式獲取撥號連線的動態IP地址

----   首先,要用函式RasEnumConnections列出已建立的活動撥號連線的資訊,其中包括連線名稱、連線控制程式碼、連線裝置型別和裝置名稱;然後根據連線控制程式碼用函式RasGetProjectionInfo獲取連線對應的一個TRASPPPIP結構,其中包括一個成員屬性szIpAddress即為動態IP地址。具體請參見以下程式片段和註釋資訊。

procedure TForm1.Button1Click(Sender: T); const MaxConnections = 10;//假設最多有10個活動的撥號連線 var connections : array[0..MaxConnections-1] of RASCONN; //撥號連線陣列 longSize : dword; intAvailabelConnections : dword; //活動的撥號連線的實際數目 intIndex : integer; strTemp : string; dwResult : DWORD; dwSize : DWORD; RASpppIP : TRASPPPIP; //活動的撥號連線的動態IP地址資訊 begin connections[ 0 ].dwSize := sizeof(RASCONN); longSize := MaxConnections * connections[ 0 ].dwSize; //接收活動連線的緩衝區大小 intAvailabelConnections := 0; //獲取所有活動的撥號連線的資訊(連線控制程式碼和設定資訊) dwResult := RasEnumConnections( connections[ 0 ], longSize,intAvailabelConnections ); if 0 < > dwResult then memo1.lines.add( '錯誤:' + inttostr( dwResult ) ) else begin memo1.lines.add( '現有的活動連線有' + IntToStr( intAvailabelConnections ) + '個'); //顯示所有活動的撥號連線的資訊(設定資訊和動態IP地址) for intIndex := 0 to intAvailabelConnections - 1 do begin //顯示一個活動的撥號連線的設定資訊 strTemp := '連線名稱:' + StrPAS( connections[ intIndex ].szEntryName ) + ',裝置型別:' + StrPAS( connections[ intIndex ].szDeviceType ) + ',裝置名稱:' + StrPAS( connections[ intIndex ].szDeviceName ); memo1.lines.add( strTemp ); //顯示一個活動的撥號連線的動態IP地址 dwSize := SizeOf(RASpppIP); RASpppIP.dwSize := dwSize; dwResult := RASGetProjectionInfo ( connections[ intIndex ].hRasConn, RASP_PppIp,RasPPPIP,dwSize);//獲取動態IP地址 if 0 < > dwResult then memo1.lines.add( '錯誤:' + inttostr( dwResult )) else memo1.lines.add( '動態地址:' + StrPas(RASpppIP.szIPAddress)); end; end; end;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989226/,如需轉載,請註明出處,否則將追究法律責任。

相關文章