Moin Masterle,
erst einmal herzlich willkommen in der Delphi-PRAXiS.
Ich hatte da mal etwas "gebastelt" für einen Ping "zu Fuss"
Erst mal die Deklarationen
Delphi-Quellcode:
type
IPAddr = DWORD;
PICMP_ECHO_REPLY = ^ICMP_ECHO_REPLY;
ICMP_ECHO_REPLY = packed record
Address : ULONG;
Status : ULONG;
RoundTripTime : ULONG;
DataSize : WORD;
Reserved : WORD;
Data : Pointer;
end;
PIP_OPTION_INFORMATION = ^IP_OPTION_INFORMATION;
IP_OPTION_INFORMATION = packed record
Ttl : byte;
Tos : byte;
Flags : byte;
OptionsSize : byte;
OptionsData : Pointer;
end;
function IcmpCreateFile : DWORD; stdcall; external 'icmp.dll';
function IcmpCloseHandle(const IcmpHandle : DWORD) : longbool; stdcall; external 'icmp.dll';
function IcmpSendEcho(const IcmpHandle : DWORD;const DestinationAddress : IPAddr;const RequestData : Pointer;const RequestSize : WORD;const RequestOptions : PIP_OPTION_INFORMATION;const ReplyBuffer : Pointer;const ReplySize : DWORD;const TimeOut : DWORD) : DWORD; stdcall; external 'icmp.dll';
Und so der Aufruf:
Delphi-Quellcode:
var
hICMP : DWORD;
pierWork : PICMP_ECHO_REPLY;
dwSize : DWORD;
begin
hICMP := IcmpCreateFile;
if hICMP = INVALID_HANDLE_VALUE then exit;
try
dwSize := SizeOf(ICMP_ECHO_REPLY)+8;
pierWork := AllocMem(dwSize);
try
if IcmpSendEcho(hICMP,MAKELONG(MAKEWORD(192, 168),MAKEWORD(1, 1)),nil,0,nil,pierWork,dwSize,1000) = 0 then
begin
ShowMessage('Nicht gefunden');
end
else
begin
ShowMessage('Gefunden');
end;
finally
FreeMem(pierWork,dwSize);
end;
finally
IcmpCloseHandle(hIcmp);
end;
end;
Das alles ist auch im aktuellen
PSDK nicht sonderlich gut dokumentiert, ausserdem fehlt (zumindest bei mir) auch die entsprechende icmp.h Datei. Die Doku im
MSDN ist etwas besser.
Was dabei noch wichtig wäre:
Angeblich gibt es diese Funktionen erst ab Windows 2000, allerdings vermute ich mal, dass dies nur dabei steht, weil erst aber dieser Windows Version die Funktionen dokumentiert wurden. Wenn ich mich recht entsinne, existieren die Funktionen mindestens sein NT 4.0.
Ob diese Art des Aufrufes wirklich der Weisheit letzter Schluss sind weiss ich nicht, aber bislang hat's so funktioniert.