代码之家  ›  专栏  ›  技术社区  ›  Drew Gibson

在Delphi中GetLastError和FormatMessage的正确用法是什么?

  •  22
  • Drew Gibson  · 技术社区  · 15 年前

    2 回复  |  直到 15 年前
        1
  •  68
  •   Grim    7 年前

    Delphi中有一个集成的助手函数: SysErrorMessage . 它本质上是一个包装器 FormatMessage

    例如,您可以使用此选项显示最后一个错误:

    ShowMessage(SysErrorMessage(GetLastError))
    

    如果要使用此消息引发异常,则更简单:

    RaiseLastOSError;
    

    重要的 :确保在失败的函数和对的调用之间没有其他API调用 GetLastError ,否则将重置最后一个错误。

        2
  •  12
  •   dummzeuch Stijn Sanders    4 年前

    虽然DR是正确的,但这种方法存在一个问题:它不允许您指定发生错误的上下文。见过错误“一个API函数失败”吗?不知道它是哪个函数,发生在哪里?

    这就是我编写RaiseLastOsErrorEx和Win32CheckEx函数的原因:

    procedure RaiseLastOsErrorEx(const _Format: string);
    begin
      RaiseLastOsErrorEx(GetLastError, _Format);
    end;
    
    procedure RaiseLastOsErrorEx(_ErrorCode: integer; _Format: string); overload;
    var
      Error: EOSError;
    begin
      if _ErrorCode <> ERROR_SUCCESS then
        Error := EOSError.CreateFmt(_Format, [_ErrorCode, SysErrorMessage(_ErrorCode)])
      else
        Error := EOsError.CreateFmt(_Format, [_ErrorCode, _('unknown OS error')]);
      Error.ErrorCode := _ErrorCode;
      raise Error;
    end;
    
    function GetLastOsError(out _Error: string; const _Format: string = ''): DWORD;
    begin
      Result := GetLastOsError(GetLastError, _Error, _Format);
    end;
    
    function GetLastOsError(_ErrCode: integer; out _Error: string; const _Format: string = ''): DWORD;
    var
      s: string;
    begin
      Result := _ErrCode;
      if Result <> ERROR_SUCCESS then
        s := SysErrorMessage(Result)
      else
        s := _('unknown OS error');
      if _Format <> '' then
        try
          _Error := Format(_Format, [Result, s])
        except
          _Error := s;
        end else
        _Error := s;
    end;
    
    function Win32CheckEx(_RetVal: BOOL; out _ErrorCode: DWORD; out _Error: string;
      const _Format: string = ''): BOOL;
    begin
      Result := _RetVal;
      if not Result then
        _ErrorCode := GetLastOsError(_Error, _Format);
    end;
    

    https://osdn.net/projects/dzlib-tools/svn/view/dzlib/trunk/src/u_dzMiscUtils.pas?view=markup&root=dzlib-tools#l313