如何在Delphi中获取IcmpSendEcho函数错误码的可读信息
Delphi中获取ICMP Ping错误的可读信息
问题根源
你遇到的问题核心在于两点:
- SysErrorMessage无效:ICMP返回的错误码属于IP层专用错误,并非常规Windows系统错误,因此SysErrorMessage无法返回对应描述文本。
- GetIpErrorString调用逻辑错误:你当前的代码未正确分配缓冲区,也未遵循函数的调用流程,导致访问违规或返回乱码。
正确实现方式
GetIpErrorString需要先获取所需缓冲区大小,再分配内存后调用,且要注意:ICMP错误码来自ICMP_ECHO_REPLY结构体的Status字段,而非GetLastError()的返回值。
1. 修正函数声明
确保函数声明与WinAPI官方定义一致,指定宽字符版本适配Delphi Unicode字符串:
function GetIpErrorString(ErrorCode: ULONG; Buffer: PWCHAR; Size: PDWORD): DWORD; stdcall; external 'iphlpapi.dll' name 'GetIpErrorStringW';
2. 正确调用代码
var EchoReply: PICMP_ECHO_REPLY; ErrorText: string; BufferSize: DWORD; Buffer: PWCHAR; begin // 假设已完成Ping操作,EchoReply指向有效的ICMP_ECHO_REPLY结构体 if EchoReply.Status <> 0 then begin // 第一步:获取所需缓冲区大小 BufferSize := 0; GetIpErrorString(EchoReply.Status, nil, @BufferSize); // 第二步:分配缓冲区内存 Buffer := AllocMem(BufferSize * SizeOf(WCHAR)); try // 第三步:获取可读错误信息 if GetIpErrorString(EchoReply.Status, Buffer, @BufferSize) = NO_ERROR then ErrorText := Buffer; // 此时ErrorText即为可写入日志的错误描述 // 示例:WriteLog('Ping错误: ' + ErrorText); finally // 释放缓冲区避免内存泄漏 FreeMem(Buffer); end; end; end;
关键注意事项
- 错误码来源:必须使用
ICMP_ECHO_REPLY.Status字段的值,不要调用GetLastError()——Ping操作的错误不会设置系统全局错误码。 - 内存管理:手动分配缓冲区后必须在finally块释放,避免内存泄漏。
- 字符编码:显式调用
GetIpErrorStringW确保返回宽字符,能直接转换为Delphi的Unicode字符串。
内容的提问来源于stack exchange,提问作者user25427794
相关产品推荐
相关产品推荐

