You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi中获取IcmpSendEcho函数错误码的可读信息

Delphi中获取ICMP Ping错误的可读信息

问题根源

你遇到的问题核心在于两点:

  1. SysErrorMessage无效:ICMP返回的错误码属于IP层专用错误,并非常规Windows系统错误,因此SysErrorMessage无法返回对应描述文本。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:35:18