WindowsAPI関数または特定のWindowsDLL(ntdll.dllなど)の関数を利用する関数/プロシージャ/メソッドを作成する場合、最後のWin32 / Win64エラーを発生させるためにどのDelphi例外クラスを使用する必要がありますか?
System.SysUtils.EExternalに関するDelphiXE3ドキュメントからの引用:
「注:
EExternal
クラスはWin32例外コードを表します。メンバーはWin32例外レコードExceptionRecord
を指します。」その点から、Win32とWin64の例外メカニズムには違いがあると結論付けます。それらの違いは何ですか?
デバッグの目的で(つまり、スタックフレームに関連するものに関して)、違いはプラットフォームごとに例外処理の異なるコード実装につながりますか?
1 に答える
まず第一に、Free Pascal タグにもかかわらず、あなたの質問は Delphi に関するものだと思います。Delphiのドキュメントを引用しているという事実に基づいて、その仮定を立てています。
を呼び出して、Windows API メッセージを例外に変換する必要がありますRaiseLastOSError
。これにより、 が発生しEOSError
ます。これは Delphi のネイティブ例外です。
EExternalError
例外は関係ありません。これは、RTL がシステム トラップ (アクセス違反、数学エラーなど) をネイティブ例外に変換するときに使用されます。Win32 は一般に、32 ビットと 64 ビットの両方の Windows API を指すために使用されることに注意してください。実際には、32 ビットと 64 ビットの両方のバリアントを持つインターフェイスは 1 つしかありません。
基礎となる例外処理モデルは、32 ビットと 64 ビットの Windows で完全に異なります。32 ビット モデルはスタック ベースで、64 ビット モデルはテーブル ベースです。これは、例外処理と try/finally の実装が、32 ビット アーキテクチャと 64 ビット アーキテクチャの間で完全に異なることを意味します。
64 ビット テーブル ベース モデルの XE2 での元の実装には、多数の障害がありました。私自身や他の人が提出した多くの QC レポートに従って、XE3 での実装が大幅に改善されたことを嬉しく思います。
スタック オーバーフローは、これら 2 つのアーキテクチャの例外処理 ABI の低レベルの詳細に入る場所ではありません。代わりに、次の記事を提供します。