Häufig benötigt man für Internetanwendungen die eigene Internet-IP. Diese Unit liest die aktuelle IP einer Wählverbindung per RASAPI32.DLL aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| unit DynamicIP; interface uses Windows; type PRasConn = ^TRasConn; TRasConn = record dwSize: DWORD; hRasConn: THandle; szEntryName: array[0..256] of char; szDeviceType: array[0..16] of char; szDeviceName: array[0..128] of char; end; TRasPPPIP = record dwsize: DWORD; dwerror: DWORD; szlpAddress: array[0..15] of char; end; function RASGetProjectionInfo(hRasConn: THandle; RasProjection: DWORD; var lpRasPPPIP: TRasPPPIP; var lpcb: DWORD): DWORD; stdcall; function RASEnumConnections(lpRasConn: Pointer; var lpcb: DWORD; var lpcConnections: DWORD): DWORD; stdcall; function GetRASIP(Nr: Integer): String; implementation function RASEnumConnections; external 'RASAPI32.DLL' name 'RasEnumConnectionsA'; function RASGetProjectionInfo; external 'RASAPI32.DLL' name 'RasGetProjectionInfoA'; function GetRASIP(Nr: Integer): String; var RasCon:Array[1..25] of TRasConn; RASSize, RASFilledInBuffer, RASIPSize: DWord; RASPPIp:TRasPPPIP; IPPas:Array[1..16] of Char; begin Result:=''; Rascon[1].dwSize := SizeOf(TRasConn); RASSize := SizeOf(TRasConn); if RasEnumConnections(@RasCon,RASSize,RASFilledInBuffer)=0 then begin RASPPIp.dwsize:=SizeOf(TRASPPPIp); RASIPSize:=SizeOf(TRASPPPIp); RASGetProjectionInfo(RasCon[Nr].hRasConn,$8021,RASPPIp,RASIPSize); Result:=RASPPIp.szlpAddress; end; end; end. |
Mit
GetRASIP(1) bekommt man die aktuelle IP dann zurück.
Bis dann
Arakis
Hinweis: Da dieser Ansatz auf einer Wählverbindung basiert, wird der Code bei z.B. einer DSL-Anbindung und einem NAT-Router nicht funktionieren.
Hier ist eine Lösung, die auch mit einem NAT-Router funktioniert.
Moderiert von Narses: Beitrag überarbeitet.