Win32 API 日本語リファレンス
ホームSystem.Com › EXCEPINFO

EXCEPINFO

構造体
サイズx64: 64 バイト / x86: 32 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
wCodeWORD2+0+0エラーコードです。エラーコードは 1000 より大きい値でなければなりません。このフィールドか scode フィールドのいずれか一方を設定する必要があり、もう一方は 0 に設定しなければなりません。
wReservedWORD2+2+2予約済みです。0 でなければなりません。
bstrSourceLPWSTR8/4+8+4例外の発生元の名前です。通常はアプリケーション名です。このフィールドは IDispatch の実装者が設定します。
bstrDescriptionLPWSTR8/4+16+8表示する例外の説明です。説明が利用できない場合は null を使用します。
bstrHelpFileLPWSTR8/4+24+12完全修飾されたヘルプファイルのパスです。ヘルプが利用できない場合は null を使用します。
dwHelpContextDWORD4+32+16ヘルプコンテキスト ID です。
pvReservedvoid*8/4+40+20予約済みです。null でなければなりません。
pfnDeferredFillInLPEXCEPFINO_DEFERRED_FILLIN8/4+48+24遅延設定 (deferred fill-in) を提供します。遅延設定が不要な場合、このフィールドは null に設定してください。
scodeINT4+56+28エラーを示す戻り値です。このフィールドか wCode のいずれか一方 (両方は不可) を設定する必要があり、もう一方は 0 に設定しなければなりません。(16 ビット版 Windows のみ。)

公式ドキュメント

IDispatch::Invoke の実行中に発生した例外を記述します。

解説(Remarks)

pfnDeferredFillIn フィールドを使用すると、オブジェクトは bstrDescriptionbstrHelpFiledwHelpContext の各フィールドの設定を、実際に必要になるまで遅延させることができます。このフィールドは、たとえばエラー用の文字列の読み込みに時間がかかる場合に利用します。遅延設定を使用する場合、オブジェクトはこのスロットに関数ポインターを格納し、必須である wCode 以外のフィールドは設定しません。

追加情報を取得するには、呼び出し元が EXCEPINFO 構造体を pexcepinfo コールバック関数に渡し、その関数が追加情報を設定します。ActiveX オブジェクトと ActiveX クライアントが別々のプロセスにある場合、ActiveX オブジェクトはコントローラーに戻る前に pfnDeferredFillIn を呼び出します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// EXCEPINFO  (x64 64 / x86 32 バイト)
typedef struct EXCEPINFO {
    WORD wCode;
    WORD wReserved;
    LPWSTR bstrSource;
    LPWSTR bstrDescription;
    LPWSTR bstrHelpFile;
    DWORD dwHelpContext;
    void* pvReserved;
    LPEXCEPFINO_DEFERRED_FILLIN pfnDeferredFillIn;
    INT scode;
} EXCEPINFO;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct EXCEPINFO
{
    public ushort wCode;
    public ushort wReserved;
    public IntPtr bstrSource;
    public IntPtr bstrDescription;
    public IntPtr bstrHelpFile;
    public uint dwHelpContext;
    public IntPtr pvReserved;
    public IntPtr pfnDeferredFillIn;
    public int scode;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure EXCEPINFO
    Public wCode As UShort
    Public wReserved As UShort
    Public bstrSource As IntPtr
    Public bstrDescription As IntPtr
    Public bstrHelpFile As IntPtr
    Public dwHelpContext As UInteger
    Public pvReserved As IntPtr
    Public pfnDeferredFillIn As IntPtr
    Public scode As Integer
End Structure
import ctypes
from ctypes import wintypes

class EXCEPINFO(ctypes.Structure):
    _fields_ = [
        ("wCode", ctypes.c_ushort),
        ("wReserved", ctypes.c_ushort),
        ("bstrSource", ctypes.c_void_p),
        ("bstrDescription", ctypes.c_void_p),
        ("bstrHelpFile", ctypes.c_void_p),
        ("dwHelpContext", wintypes.DWORD),
        ("pvReserved", ctypes.c_void_p),
        ("pfnDeferredFillIn", ctypes.c_void_p),
        ("scode", ctypes.c_int),
    ]
#[repr(C)]
pub struct EXCEPINFO {
    pub wCode: u16,
    pub wReserved: u16,
    pub bstrSource: *mut core::ffi::c_void,
    pub bstrDescription: *mut core::ffi::c_void,
    pub bstrHelpFile: *mut core::ffi::c_void,
    pub dwHelpContext: u32,
    pub pvReserved: *mut core::ffi::c_void,
    pub pfnDeferredFillIn: *mut core::ffi::c_void,
    pub scode: i32,
}
import "golang.org/x/sys/windows"

type EXCEPINFO struct {
	wCode uint16
	wReserved uint16
	bstrSource uintptr
	bstrDescription uintptr
	bstrHelpFile uintptr
	dwHelpContext uint32
	pvReserved uintptr
	pfnDeferredFillIn uintptr
	scode int32
}
type
  EXCEPINFO = record
    wCode: Word;
    wReserved: Word;
    bstrSource: Pointer;
    bstrDescription: Pointer;
    bstrHelpFile: Pointer;
    dwHelpContext: DWORD;
    pvReserved: Pointer;
    pfnDeferredFillIn: Pointer;
    scode: Integer;
  end;
const EXCEPINFO = extern struct {
    wCode: u16,
    wReserved: u16,
    bstrSource: ?*anyopaque,
    bstrDescription: ?*anyopaque,
    bstrHelpFile: ?*anyopaque,
    dwHelpContext: u32,
    pvReserved: ?*anyopaque,
    pfnDeferredFillIn: ?*anyopaque,
    scode: i32,
};
type
  EXCEPINFO {.bycopy.} = object
    wCode: uint16
    wReserved: uint16
    bstrSource: pointer
    bstrDescription: pointer
    bstrHelpFile: pointer
    dwHelpContext: uint32
    pvReserved: pointer
    pfnDeferredFillIn: pointer
    scode: int32
struct EXCEPINFO
{
    ushort wCode;
    ushort wReserved;
    void* bstrSource;
    void* bstrDescription;
    void* bstrHelpFile;
    uint dwHelpContext;
    void* pvReserved;
    void* pfnDeferredFillIn;
    int scode;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; EXCEPINFO サイズ: 32 バイト(x86)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; wCode : WORD (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; wReserved : WORD (+2, 2byte)  wpoke st,2,値  /  値 = wpeek(st,2)
; bstrSource : LPWSTR (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; bstrDescription : LPWSTR (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; bstrHelpFile : LPWSTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dwHelpContext : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; pvReserved : void* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; pfnDeferredFillIn : LPEXCEPFINO_DEFERRED_FILLIN (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; scode : INT (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; EXCEPINFO サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; wCode : WORD (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; wReserved : WORD (+2, 2byte)  wpoke st,2,値  /  値 = wpeek(st,2)
; bstrSource : LPWSTR (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; bstrDescription : LPWSTR (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; bstrHelpFile : LPWSTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; dwHelpContext : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; pvReserved : void* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; pfnDeferredFillIn : LPEXCEPFINO_DEFERRED_FILLIN (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; scode : INT (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global EXCEPINFO
    #field short wCode
    #field short wReserved
    #field intptr bstrSource
    #field intptr bstrDescription
    #field intptr bstrHelpFile
    #field int dwHelpContext
    #field intptr pvReserved
    #field intptr pfnDeferredFillIn
    #field int scode
#endstruct

stdim st, EXCEPINFO        ; NSTRUCT 変数を確保
st->wCode = 100
mes "wCode=" + st->wCode