3
  1. WindowsAPI関数または特定のWindowsDLL(ntdll.dllなど)の関数を利用する関数/プロシージャ/メソッドを作成する場合、最後のWin32 / Win64エラーを発生させるためにどのDelphi例外クラスを使用する必要がありますか?

    System.SysUtils.EExternalに関するDelphiXE3ドキュメントからの引用:

    「注:EExternalクラスはWin32例外コードを表します。メンバーはWin32例外レコードExceptionRecordを指します。」
  2. その点から、Win32とWin64の例外メカニズムには違いがあると結論付けます。それらの違いは何ですか?

  3. デバッグの目的で(つまり、スタックフレームに関連するものに関して)、違いはプラットフォームごとに例外処理の異なるコード実装につながりますか?

4

1 に答える 1

6

まず第一に、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 の低レベルの詳細に入る場所ではありません。代わりに、次の記事を提供します。

于 2012-10-14T07:53:03.403 に答える