web-dev-qa-db-ja.com

DelphiでのGetLastErrorとFormatMessageの正しい使用法は何ですか?

Delphi 2006(Delphi 7)でサードパーティコンポーネントを使用する際に問題が発生し、そのコンポーネントへの関数呼び出しを実行すると「不特定のエラー」が発生します。 DelphiのGetLastErrorとFormatMessageを利用するサンプルコードがありますか?これにより、エラーに関する詳細情報にアクセスできますか? TIA :)

23
Drew Gibson

Delphiには統合されたヘルパー関数があります:SysErrorMessage。これは基本的にFormatMessageのラッパーですが、この場合ははるかに簡単に使用できます。テキストによる説明が必要なエラーコードを入力するだけです。

たとえば、これを使用して最後のエラーを表示できます。

ShowMessage(SysErrorMessage(GetLastError))

このメッセージで例外を発生させたい場合は、さらに簡単です。

RaiseLastOSError;

重要:失敗した関数とGetLastErrorの呼び出しの間に追加のAPI呼び出しがないことを確認してください。そうでない場合、最後のエラーがリセットされます。

56
Daniel Rikowski

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://sourceforge.net/p/dzlib/code/HEAD/tree/dzlib/trunk/src/u_dzOsUtils.pas

8
dummzeuch