结合第三方控件TPING
const 
   IP:string;
判断某台计算机是否在线ping1.Address :=IP;
result:=Ping1.Ping>0;

解决方案 »

  1.   

    找到icmp.dll,引出其中 的 函数 ,就 可以实现ping的功能 了 。
    具体函数名和声明你可以 查以前的 帖子。随便一个delphi技巧之类的 书上都有的 。ping不是api函数 ,是操作系统带的一个 工具。
      

  2.   

    在Delphi6中: Inet_Addr: TInet_AddrProc  = nil;
      //即FIPAddress := inet_addr(PChar(HostIP));不能执行啊!
      //怎么办!!!
    Top 
     回复人: kylion(凯林) (  ) 信誉:100  2002-1-14 14:24:02  得分:0    我知道为什么上面的代码出错的原因了。
    在调用idWinSock.pas的函数之前要对这些函数初始化!
    必须调用loadwinsock过程。
    即(可以执行的ping函数代码):
    unit UnitICMP;
    interface
    uses Windows, Classes;
    type
       PIPOptionInformation = ^TIPOptionInformation;
       TIPOptionInformation = packed record
       TTL: Byte;
       TOS: Byte;
       Flags: Byte;
       OptionsSize: Byte;
       OptionsData: PChar;
       end;
       PIcmpEchoReply = ^TIcmpEchoReply;
       TIcmpEchoReply = packed record
       Address: DWORD;
       Status: DWORD;
       RTT: DWORD;
       DataSize: Word;
       Reserved: Word;
       Data: Pointer;
       Options: TIPOptionInformation ;
       end;
       TIcmpCreateFile = function: THandle; stdcall;
       TIcmpCloseHandle = function(IcmpHandle: THandle):Boolean;stdcall;
       TIcmpSendEcho=function(IcmpHandle:THandle;
       DestinationAddress:DWORD;
       RequestData:Pointer;RequestSize:Word;
       RequestOptions:PIPOptionInformation;
       ReplyBuffer: PIcmpEchoReply;
       ReplySize: DWord;
       Timeout: DWord
       ): DWord; stdcall;
       procedure InitICMP(Lines:Tstrings);
       procedure Ping(Host:string; Lines:Tstrings);
    var
       hICMP: THANDLE;
       IcmpCreateFile : TIcmpCreateFile;
       IcmpCloseHandle: TIcmpCloseHandle;
       IcmpSendEcho: TIcmpSendEcho;
    implementation
    uses IdWinsock, SysUtils;
    procedure InitICMP(Lines:Tstrings);//初始化ICMP库函数
    var
      // WSAData: TWSAData;
       hICMPdll: HMODULE;
    begin
       //WSAStartup($0202, WSAData);
       // Load the icmp.dll stuff    
       hICMPdll := LoadLibrary('icmp.dll');
       @ICMPCreateFile := GetProcAddress(hICMPdll,'IcmpCreateFile');
       @IcmpCloseHandle := GetProcAddress(hICMPdll,'IcmpCloseHandle');
       @IcmpSendEcho := GetProcAddress(hICMPdll,'IcmpSendEcho');
       hICMP := IcmpCreateFile;
       Lines.Add('目的IP地址 字节数 返回时间(毫秒)');
       end;
    procedure Ping(Host:string; Lines:Tstrings);
    var
       IPOpt:TIPOptionInformation;
       // IP Options for packet to send
       FIPAddress:DWORD;
       pReqData,pRevData:PChar;
       pIPE:PIcmpEchoReply;// ICMP Echo reply buffer
       FSize: DWORD;
       MyString:string;
       FTimeOut:DWORD;
       BufferSize:DWORD;
    begin
          //首先检验是否为合法IP
         if Host <> '' then
         begin
        LoadWinsock;//帖子上的几乎所有的关于ping的代码都没有这句。但在Delphi6中是必需的。
        FIPAddress := inet_addr(PChar(Host));
        FSize := 40;
        BufferSize := SizeOf(TICMPEchoReply) + FSize;
        GetMem(pRevData,FSize);
        GetMem(pIPE,BufferSize);
            FillChar(pIPE^, SizeOf(pIPE^), 0);
            pIPE^.Data := pRevData;
            MyString := 'Hello,World';
            pReqData := PChar(MyString);
            FillChar(IPOpt, Sizeof(IPOpt), 0);
            IPOpt.TTL := 64;
            FTimeOut := 4000;
            IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);       if pReqData^ = pIPE^.Options.OptionsData^ then
            begin
                Lines.Add(Host + ' '+IntToStr(pIPE^.DataSize) +' '+IntToStr(pIPE^.RTT));
            end;       FreeMem(pRevData);
            FreeMem(pIPE);       end;
        end;  end.