在WIN9X下,如果安裝了撥號網絡,則在WINDOWS系統的系統目錄System下將有兩個撥號網路管理程式庫RasApi32.DLL和RasApi16.DLL,我們可利用其中的RAS系列函數來取得和設定撥號連接網路的資訊。當然是可以取得撥號連線的動態ip位址了。在Delphi幫助文件中,有相關RAS函數的詳細說明。
----一、先解釋一些要用到的資料常數和資料結構。
constRAS_MaxDeviceType = 16;//裝置類型名稱長度RAS_MaxEntryName = 256;//連線名稱最大長度RAS_MaxDeviceName = 128;//裝置名稱最大長度RAS_MaxIpAddress = 15;//IP位址的最大長度Rasp_PppIp = $8021///////1////協定類型,該數值表示PPP連接typeHRASCONN = DWord;//撥號連接句柄的類型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///接收動態資訊;//接收動態資訊;的緩衝區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: TObject);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); ConnectionSize connection= 0n. ].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[ intzDeviceType ) + ',裝置名稱:' + StrPAS( connections[ intIndex ].szDDevice; memo1.lines.add( strTemp ); //顯示一個活動的撥號連線的動態IP位址dwSize := SizeOf(RASpppIP); RASpppIP.dwSize := dwSize; dwResult := RASGetProjectionInfo( connections[ intIndex ].hRasConn,RASP_PppIp,RASPPpp//// IP位址if 0 < > dwResult then memo1.lines.add('錯誤:' + inttostr( dwResult )) else memo1.lines.add( '動態位址:' + StrPas(RASpppIP.szIPAddress)); end; end;end;