delphi中编程Ping不通时为什么会出错?

hazhangaimin 2008-03-04 06:13:04
请高手帮忙看一下,为什么拼不通时会出现这个错 Project Ping_Dll_P.exe raised exception class EAccessViolation with message 'Access violation at address 00454f2d in module 'Ping_Dll_P.exe'. Read of address ....
出错时箭头指向 if pReqData^=pIPE^.Options.OptionsData^ then

程序如下:
unit Ping_Dll_U;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ExtCtrls, StdCtrls,winsock;

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: Pointer;
ReplySize: DWord;
Timeout: DWord
): DWord; stdcall;
TPingForm = class(TForm)
StatusShow: TMemo;
pingEdit: TEdit;
exebutton: TButton;
procedure FormCreate(Sender: TObject);
procedure exebuttonClick(Sender: TObject);
private
{ Private declarations }
hICMP: THANDLE;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
public
{ Public declarations }
end;

var
PingForm: TPingForm;

implementation

{$R *.dfm}

procedure TPingForm.FormCreate(Sender: TObject);
var
WSAData: TWSAData;
hICMPdll: HMODULE;
begin
wsastartup($101,wsadata);
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
StatusShow.Text := '';
statusshow.Align := alNone;
StatusShow.Lines.Add('目的IP地址 字节数 返回时间(毫秒)');
end;

procedure TPingForm.exebuttonClick(Sender: TObject);
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
if PingEdit.Text <> '' then
begin
FIPAddress := inet_addr(PChar(PingEdit.Text));
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);
//try
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
//messagedlg('没有找到该IP地址!',mtinformation,[mbok],0);
end;
//except
messagedlg('没有找到该IP地址!',mtinformation,[mbok],0);
//end;
FreeMem(pRevData);
FreeMem(pIPE);
end;
end;

end.
...全文
88 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocha 2008-03-05
  • 打赏
  • 举报
回复
if p = nil then
or if p <> nil then
hazhangaimin 2008-03-05
  • 打赏
  • 举报
回复
我是新手,请问如何检查各个指针是否为nil?
xiaocha 2008-03-05
  • 打赏
  • 举报
回复
检查各个指针是否为nil
flyingcat2007 2008-03-04
  • 打赏
  • 举报
回复
我有1个DLEPHI写的PING程序,如果你要的话,可以与我联系,我发邮件给你
yaodong2001@sina.com

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧