Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中GetLastError和FormatMessage的正确用法是什么?_Delphi_Winapi_Error Handling - Fatal编程技术网

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

在Delphi中GetLastError和FormatMessage的正确用法是什么?,delphi,winapi,error-handling,Delphi,Winapi,Error Handling,我在Delphi2006(也是Delphi7)中使用第三方组件时遇到了一个问题,在执行对该组件的函数调用时,我遇到了一个“未指定的错误”。您是否有在Delphi中使用GetLastError和FormatMessage的示例代码,允许我访问有关错误的更多信息?TIA:)在Delphi中有一个集成的助手函数:SysErrorMessage。它本质上是格式化消息的包装器,但在您的案例中使用起来要简单得多。只需提供您需要的文本描述的错误代码 例如,您可以使用此选项显示最后一个错误: ShowMessa

我在Delphi2006(也是Delphi7)中使用第三方组件时遇到了一个问题,在执行对该组件的函数调用时,我遇到了一个“未指定的错误”。您是否有在Delphi中使用GetLastError和FormatMessage的示例代码,允许我访问有关错误的更多信息?TIA:)

在Delphi中有一个集成的助手函数:
SysErrorMessage
。它本质上是
格式化消息
的包装器,但在您的案例中使用起来要简单得多。只需提供您需要的文本描述的错误代码

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

ShowMessage(SysErrorMessage(GetLastError))
如果要使用此消息引发异常,则更简单:

RaiseLastOSError;

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

当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;
过程RAISELASTERROREX(常量格式:字符串);
开始
RAISELASTERROREX(GetLastError,_格式);
结束;
过程RaiseLastOsErrorEx(_ErrorCode:integer;_Format:string);超载;
变量
错误:EOS错误;
开始
如果错误代码错误成功,则
错误:=EOSError.CreateFmt(_格式,[_ErrorCode,SysErrorMessage(_ErrorCode)])
其他的
错误:=EOsError.CreateFmt(_格式,[_ErrorCode,U2;('unknown OS Error')]);
Error.ErrorCode:=\u ErrorCode;
提出错误;
结束;
函数GetLastOsError(输出错误:string;常量格式:string=''):DWORD;
开始
结果:=GetLastOsError(GetLastError,_Error,_Format);
结束;
函数GetLastOsError(_ErrCode:integer;out_Error:string;const_Format:string=''):DWORD;
变量
s:字符串;
开始
结果:=\u错误代码;
如果结果错误(u SUCCESS),
s:=系统错误消息(结果)
其他的
s:=((“未知操作系统错误”);
如果_格式为“”,则
尝试
_错误:=格式(_格式,[Result,s])
除了
_错误:=s;
结束其他
_错误:=s;
结束;
函数Win32CheckEx(_-RetVal:BOOL;out-ErrorCode:DWORD;out-Error:string;
常量格式:字符串=“”):BOOL;
开始
结果:=\u RetVal;
如果没有结果的话
_错误代码:=GetLastOsError(\u错误,\u格式);
结束;
(它们是我的dzLib库的u_dzMiscUtils单元的一部分,可在以下位置获得:

非常感谢您提供的附加代码和链接:)+1像madExcept这样的通用异常框架会更好。@DR:是的,也许吧,但这不是问题所在。在这种情况下:也不是“指定错误发生的上下文”…注:使用资源字符串将导致API调用,因此您会丢失错误代码!你必须为你的问题添加更多的上下文。您的代码实际上是什么样子的<代码>“未指定错误”是一条实际的系统错误消息(针对
E_FAIL
错误代码),因此您可能无法获得有关故障的更多详细信息,具体取决于您正在执行的操作。“未指定错误”消息的确切来源是哪里?是什么让您认为第三方组件利用
(Get | Set)LastError()
为您提供了比您已有的更多的详细信息?嗨,雷米,谢谢您的评论:)。事实上,我在2009年就发布了这种方式,所以我不记得上下文,更不用说还有代码了。干杯你是对的。我的错。我没有注意到问题的日期。我想dummzeuch最近对他的答案进行了编辑,这让我把这个问题提到了最重要的位置。我得更注意日期。