我在Delphi 2006(以及Delphi 7)中使用第三方组件时遇到了问题,在执行对该组件的函数调用时出现“未指定的错误”。您是否有关于如何在Delphi中使用GetLastError和FormatMessage的示例代码,以便我可以获取有关错误的更多信息?谢谢!
我在Delphi 2006(以及Delphi 7)中使用第三方组件时遇到了问题,在执行对该组件的函数调用时出现“未指定的错误”。您是否有关于如何在Delphi中使用GetLastError和FormatMessage的示例代码,以便我可以获取有关错误的更多信息?谢谢!
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;
它们是我的dzLib库中u_dzMiscUtils单元的一部分,该库可以在此处获取: https://osdn.net/projects/dzlib-tools/svn/view/dzlib/trunk/src/u_dzMiscUtils.pas?view=markup&root=dzlib-tools#l313
E_FAIL
错误代码),所以根据你正在做的事情,你可能无法获得更多关于失败的细节。你从哪里获得了“未指定错误”的消息?你认为第三方组件利用(Get|Set)LastError()
给你提供比你已经拥有的更多的细节吗? - Remy Lebeau