Hallo,
ich habe eine dringende Bitte: Ich muss am Montag zwei Stunden lang meinen Mitschülern im Informatikunterricht objektorientiertes Programmieren erklären. Die erste Stunde mache ich Definitionen, Diagramme und wichtige Methoden und die zweite Stunde möchte ich eben mit ihnen zusammen ein Programm erarbeiten, dass einen Ping über die icmp.dll durchführt. Ich habe bereits einen Button selber gemacht (wegen Klassen und so). Die Ping-Prozedur habe ich mal im Web gefunden, sie funktioniert auch super, aber ich weiß nicht wie (Das muss ich aber genau wissen, um sie vorzustellen!).
Ich wäre euch total dankbar, wenn sich bis morgen Abend
einer findet, der sich die Mühe machen würde den folgenden Quelltext zu kommentieren!
Delphi-Quellcode:
unit Unit2;
interface
uses
Windows, SysUtils, Classes;
type
TSunB =
packed record
s_b1, s_b2, s_b3, s_b4: byte;
end;
TSunW =
packed record
s_w1, s_w2: word;
end;
PIPAddr = ^TIPAddr;
TIPAddr =
record
case integer
of
0: (S_un_b: TSunB);
1: (S_un_w: TSunW);
2: (S_addr: longword);
end;
IPAddr = TIPAddr;
function IcmpCreateFile : THandle;
stdcall;
external '
icmp.dll';
function IcmpCloseHandle (icmpHandle : THandle) : boolean;
stdcall;
external '
icmp.dll'
function IcmpSendEcho
(IcmpHandle : THandle; DestinationAddress : IPAddr;
RequestData : Pointer; RequestSize : Smallint;
RequestOptions : pointer;
ReplyBuffer : Pointer;
ReplySize : DWORD;
Timeout : DWORD) : DWORD;
stdcall;
external '
icmp.dll';
function Ping(InetAddress :
string) : boolean;
implementation
uses
WinSock;
procedure TranslateStringToTInAddr(AIP:
string;
var AInAddr);
var
phe: PHostEnt;
pac: PChar;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
try
phe := GetHostByName(PChar(AIP));
if Assigned(phe)
then
begin
pac := phe^.h_addr_list^;
if Assigned(pac)
then
begin
with TIPAddr(AInAddr).S_un_b
do begin
s_b1 := Byte(pac[0]);
s_b2 := Byte(pac[1]);
s_b3 := Byte(pac[2]);
s_b4 := Byte(pac[3]);
end;
end
else
begin
raise Exception.Create('
Error getting IP from HostName');
end;
end
else
begin
raise Exception.Create('
Error getting HostName');
end;
except
FillChar(AInAddr, SizeOf(AInAddr), #0);
end;
WSACleanup;
end;
function Ping(InetAddress :
string) : boolean;
var
Handle : THandle;
InAddr : IPAddr;
DW : DWORD;
rep :
array[1..128]
of byte;
begin
result := false;
Handle := IcmpCreateFile;
if Handle = INVALID_HANDLE_VALUE
then
Exit;
TranslateStringToTInAddr(InetAddress, InAddr);
DW := IcmpSendEcho(
Handle, InAddr,
nil, 0,
nil, @rep, 128, 0);
Result := (DW <> 0);
IcmpCloseHandle(
Handle);
end;
end.
Ich habe mich leider noch nie mit Records beschäftigt (mache ich aber sofort) und weiß auch nicht, was 'stdcall' heißt.
Vielen Dank schon mal im Vorraus für die Hilfe!!!
Viele Grüße vom LAWn-M0W3R