获取 IcmpSendEcho 函数错误代码的错误字符串

问题描述 投票:0回答:1

我正在 delphi 中使用 icmp ping 的实现。现在,我尝试获取人类可读的错误消息,以防设备无法访问,以便我可以将其打印在错误日志中。

您能否向我解释一下如何获得here定义的人类可读的错误代码,而无需执行 switch case 并手动编写字符串。我可以使用 SysErrorMessage、GetIpErrorString 或任何其他 WinApi 或基本 delphi 函数(如果有的话)。

我已经尝试过在互联网上找到的两种方法:

  1. SysErrorMessage 但这导致了不相关的文本。

  2. GetIpErrorString 函数 但我只是无法让它正常工作。我当前的试验只是导致访问冲突或看似随机的字节数组。 当前外部函数定义和方法调用是这样的:

function GetIpErrorString(
    const ErrorCode : ULong; 
    out Buffer : Pointer; 
    const Size : PDWORD
): DWORD; stdcall; external 'iphlpapi.dll';

var
  errorText         : string;
  bufferSize        : Integer;
  status            : ULong;
  ptr               : pointer;
begin

    // Here is the ping stuff. 
    // i already verified that this works as the numbers for the
    // responseCode are what i would from icmp send error

    status := GetLastError();
    bufferSize := 200;

    GetIpErrorString(
      status,
      ptr,
      @bufferSize
    );

    SetString(errorText, PChar(ptr), 5);
end
delphi winapi delphi-11-alexandria
1个回答
0
投票

感谢 IInspectable 我现在可以正常工作了。我误解了 delphi 中“out”的作用,这就是访问冲突的来源。所以我将功能更改为

function GetIpErrorString(
  const ErrorCode : ULong; 
  const Buffer : Pointer; 
  const Size : PDWORD
): DWORD; stdcall; external 'iphlpapi.dll';

并在调用该方法之前将字符串 errorText 初始化为长度 200

SetLength(errorText, bufferSize);
GetIpErrorString(
  status,
  Pointer(errorText),
  @bufferSize
);
© www.soinside.com 2019 - 2024. All rights reserved.