У меня проблема с использованием стороннего компонента в Delphi 2006 (также Delphi 7), в котором я получаю «Неопределенную ошибку» при выполнении вызова функции для этого компонента. У вас есть пример кода, который использует GetLastError и FormatMessage в Delphi, что позволит мне получить дополнительную информацию об ошибке? TIA :)
Как правильно использовать GetLastError и FormatMessage в Delphi?
Ответы (2)
В Delphi есть встроенная вспомогательная функция: SysErrorMessage. По сути, это оболочка для FormatMessage, но в вашем случае ее гораздо проще использовать. Просто укажите код ошибки, для которой вам нужно текстовое описание.
Например, вы можете использовать это для отображения последней ошибки:
ShowMessage(SysErrorMessage(GetLastError))
Если вы хотите вызвать исключение с этим сообщением, это еще проще:
RaiseLastOSError;
Важно: убедитесь, что нет дополнительного вызова API между сбойной функцией и вашим вызовом GetLastError, в противном случае последняя ошибка будет сброшена.
Хотя 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;
(Они являются частью модуля u_dzMiscUtils моей библиотеки dzLib, доступной здесь: https://osdn.net/projects/dzlib-tools/svn/view/dzlib/trunk/src/u_dzMiscUtils.pas?view=markup&root=dzlib-tools#l313
"Unspecified error"- это фактическое сообщение об ошибке системы (для кода ошибкиE_FAIL), поэтому, вероятно, вы не сможете получить более подробную информацию об ошибке, в зависимости от того, что именно вы делаете. Откуда именно вы получаете сообщение об ошибке "Не указано"? И что заставляет вас думать, что сторонний компонент использует(Get|Set)LastError(), чтобы предоставить вам больше деталей, чем у вас уже есть? - person Remy Lebeau   schedule 11.05.2020