OPENFILENAMEA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| lStructSize | DWORD | 4 | +0 | +0 | 構造体の長さ (バイト単位)。
このパラメーターには sizeof (OPENFILENAME) を使用します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| hwndOwner | HWND | 8/4 | +4 | +4 | ダイアログボックスを所有するウィンドウへのハンドル。このメンバーには任意の有効なウィンドウハンドルを指定できます。ダイアログボックスに所有者がない場合は NULL を指定できます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| hInstance | HINSTANCE | 8/4 | +12 | +8 | Flags メンバーに OFN_ENABLETEMPLATEHANDLE フラグが設定されている場合、hInstance はダイアログボックステンプレートを格納したメモリオブジェクトへのハンドルです。OFN_ENABLETEMPLATE フラグが設定されている場合、hInstance は lpTemplateName メンバーで指定された名前のダイアログボックステンプレートを含むモジュールへのハンドルです。どちらのフラグも設定されていない場合、このメンバーは無視されます。OFN_EXPLORER フラグが設定されている場合、システムは指定されたテンプレートを使用して、既定のエクスプローラースタイルのダイアログボックスの子となるダイアログボックスを作成します。OFN_EXPLORER フラグが設定されていない場合、システムはそのテンプレートを使用して、既定のダイアログボックスを置き換える旧スタイルのダイアログボックスを作成します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrFilter | LPSTR | 8/4 | +20 | +12 | NULL 終端のフィルター文字列の対を格納するバッファー。バッファー内の最後の文字列は 2 つの NULL 文字で終端されていなければなりません。 各対の最初の文字列はフィルターを説明する表示用文字列 (例: "Text Files")、2 番目の文字列はフィルターパターン (例: システムはフィルターの順序を変更しません。lpstrFilter で指定された順序どおりに File Types コンボボックスに表示します。 lpstrFilter が NULL の場合、ダイアログボックスはフィルターを一切表示しません。 ショートカットの場合、フィルターが設定されていないと、GetOpenFileName および GetSaveFileName は、リンク先ではなく .lnk ファイル自体の名前を取得します。この動作は、Flags メンバーに OFN_NODEREFERENCELINKS フラグを設定した場合と同じです。フィルターを適用せずにショートカットのリンク先を取得するには、文字列 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrCustomFilter | LPSTR | 8/4 | +28 | +16 | ユーザーが選択したフィルターパターンを保持するための、NULL 終端フィルター文字列の対を格納する静的バッファー。最初の文字列はカスタムフィルターを説明するアプリケーション側の表示用文字列で、2 番目の文字列はユーザーが選択したフィルターパターンです。アプリケーションが最初にダイアログボックスを作成するときには最初の文字列を指定します。これは空でない任意の文字列で構いません。ユーザーがファイルを選択すると、ダイアログボックスは現在のフィルターパターンを 2 番目の文字列にコピーします。保持されるフィルターパターンは、lpstrFilter バッファーで指定されたパターンのいずれか、またはユーザーが入力したフィルターパターンです。システムはこれらの文字列を使用して、次回ダイアログボックスが作成されるときにユーザー定義のファイルフィルターを初期化します。nFilterIndex メンバーが 0 の場合、ダイアログボックスはカスタムフィルターを使用します。 このメンバーが NULL の場合、ダイアログボックスはユーザー定義のフィルターパターンを保持しません。 このメンバーが NULL でない場合、nMaxCustFilter メンバーの値で lpstrCustomFilter バッファーのサイズ (文字数単位) を指定しなければなりません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nMaxCustFilter | DWORD | 4 | +36 | +20 | lpstrCustomFilter で示されるバッファーのサイズ (文字数単位)。このバッファーは少なくとも 40 文字以上の長さが必要です。lpstrCustomFilter が NULL であるか、NULL 文字列を指している場合、このメンバーは無視されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nFilterIndex | DWORD | 4 | +40 | +24 | File Types コントロールで現在選択されているフィルターのインデックス。lpstrFilter が指すバッファーには、フィルターを定義する文字列の対が格納されています。最初の対のインデックス値は 1、2 番目の対は 2、というように続きます。インデックス 0 は lpstrCustomFilter で指定されたカスタムフィルターを示します。入力時にインデックスを指定して、ダイアログボックスの初期フィルターの説明とフィルターパターンを指示できます。ユーザーがファイルを選択すると、nFilterIndex には現在表示されているフィルターのインデックスが返されます。nFilterIndex が 0 で lpstrCustomFilter が NULL の場合、システムは lpstrFilter バッファー内の最初のフィルターを使用します。これら 3 つのメンバーがすべて 0 または NULL の場合、システムはフィルターを使用せず、ダイアログボックスのファイル一覧コントロールにファイルを表示しません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrFile | LPSTR | 8/4 | +44 | +28 | File Name エディットコントロールの初期化に使用されるファイル名。初期化が不要な場合は、このバッファーの最初の文字を NULL にしなければなりません。GetOpenFileName 関数または GetSaveFileName 関数が正常に戻ると、このバッファーには選択されたファイルのドライブ指定子、パス、ファイル名、および拡張子が格納されます。 OFN_ALLOWMULTISELECT フラグが設定されていて、ユーザーが複数のファイルを選択した場合、バッファーには現在のディレクトリに続いて選択されたファイルの名前が格納されます。エクスプローラースタイルのダイアログボックスでは、ディレクトリ文字列とファイル名文字列は NULL で区切られ、最後のファイル名の後にさらに NULL 文字が付きます。旧スタイルのダイアログボックスでは、これらの文字列は空白で区切られ、空白を含むファイル名には短いファイル名が使用されます。長いファイル名と短いファイル名の変換には FindFirstFile 関数を使用できます。ユーザーが 1 つのファイルだけを選択した場合、lpstrFile 文字列にはパスとファイル名の間に区切り文字は入りません。 バッファーが小さすぎる場合、関数は FALSE を返し、CommDlgExtendedError 関数は FNERR_BUFFERTOOSMALL を返します。この場合、lpstrFile バッファーの先頭 2 バイトに必要なサイズ (バイト単位または文字数単位) が格納されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nMaxFile | DWORD | 4 | +52 | +32 | lpstrFile が指すバッファーのサイズ (文字数単位)。このバッファーは、終端の NULL 文字を含め、パスとファイル名の文字列を格納できる十分な大きさでなければなりません。バッファーがファイル情報を格納するには小さすぎる場合、GetOpenFileName 関数および GetSaveFileName 関数は FALSE を返します。バッファーは少なくとも 256 文字以上の長さにしてください。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrFileTitle | LPSTR | 8/4 | +56 | +36 | 選択されたファイルのファイル名と拡張子 (パス情報を含まない)。このメンバーは NULL にできます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nMaxFileTitle | DWORD | 4 | +64 | +40 | lpstrFileTitle が指すバッファーのサイズ (文字数単位)。lpstrFileTitle が NULL の場合、このメンバーは無視されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrInitialDir | LPSTR | 8/4 | +68 | +44 | 初期ディレクトリ。初期ディレクトリを選択するアルゴリズムはプラットフォームによって異なります。 Windows 7:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrTitle | LPSTR | 8/4 | +76 | +48 | ダイアログボックスのタイトルバーに表示する文字列。このメンバーが NULL の場合、システムは既定のタイトル (すなわち 名前を付けて保存 または 開く) を使用します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Flags | OPEN_FILENAME_FLAGS | 4 | +84 | +52 | ダイアログボックスの初期化に使用できるビットフラグの組み合わせ。ダイアログボックスが戻るときには、ユーザーの入力を示すようにこれらのフラグが設定されます。このメンバーには次のフラグの組み合わせを指定できます。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nFileOffset | WORD | 2 | +88 | +56 | lpstrFile が指す文字列において、パスの先頭からファイル名までの 0 から始まるオフセット (文字数単位)。ANSI 版ではバイト数、Unicode 版では文字数になります。たとえば lpstrFile が次の文字列 "c:\dir1\dir2\file.ext" を指している場合、このメンバーには "file.ext" 文字列のオフセットを示す値 13 が格納されます。ユーザーが複数のファイルを選択した場合、nFileOffset は最初のファイル名までのオフセットになります。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nFileExtension | WORD | 2 | +90 | +58 | lpstrFile が指す文字列において、パスの先頭からファイル名拡張子までの 0 から始まるオフセット (文字数単位)。ANSI 版ではバイト数、Unicode 版では文字数になります。通常、ファイル名拡張子は最後に出現するドット (".") 文字の後に続く部分文字列です。たとえば、ファイル名 readme.txt の拡張子は txt、readme.txt.html の拡張子は html です。したがって、lpstrFile が文字列 "c:\dir1\dir2\readme.txt" を指している場合、このメンバーには値 20 が格納されます。lpstrFile が文字列 "c:\dir1\dir2\readme.txt.html" を指している場合、このメンバーには値 24 が格納されます。lpstrFile が文字列 "c:\dir1\dir2\readme.txt.html." を指している場合、このメンバーには値 29 が格納されます。lpstrFile が "c:\dir1\dir2\readme" のように "." 文字をまったく含まない文字列を指している場合、このメンバーには 0 が格納されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrDefExt | LPSTR | 8/4 | +92 | +60 | 既定の拡張子。ユーザーが拡張子を入力しなかった場合、GetOpenFileName および GetSaveFileName はこの拡張子をファイル名に付加します。この文字列の長さは任意ですが、付加されるのは先頭 3 文字のみです。文字列にピリオド (.) を含めないでください。このメンバーが NULL で、ユーザーが拡張子を入力しなかった場合、拡張子は付加されません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lCustData | LPARAM | 8/4 | +100 | +64 | lpfnHook メンバーで識別されるフックプロシージャにシステムが渡す、アプリケーション定義のデータ。システムが WM_INITDIALOG メッセージをフックプロシージャに送信するとき、そのメッセージの lParam パラメーターは、ダイアログボックスの作成時に指定された OPENFILENAME 構造体へのポインターです。フックプロシージャはこのポインターを使用して lCustData の値を取得できます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpfnHook | LPOFNHOOKPROC | 8/4 | +108 | +68 | フックプロシージャへのポインター。Flags メンバーに OFN_ENABLEHOOK フラグが含まれていない限り、このメンバーは無視されます。 Flags メンバーに OFN_EXPLORER フラグが設定されていない場合、lpfnHook は、ダイアログボックス宛てのメッセージを受け取る OFNHookProcOldStyle フックプロシージャへのポインターです。フックプロシージャは、メッセージを既定のダイアログボックスプロシージャに渡す場合は FALSE を、メッセージを破棄する場合は TRUE を返します。 OFN_EXPLORER が設定されている場合、lpfnHook は OFNHookProc フックプロシージャへのポインターです。このフックプロシージャは、ダイアログボックスから送信される通知メッセージを受け取ります。また、子ダイアログテンプレートを指定して定義した追加のコントロールに対するメッセージも受け取ります。フックプロシージャは、既定のダイアログボックスの標準コントロール宛てのメッセージは受け取りません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpTemplateName | LPSTR | 8/4 | +116 | +72 | hInstance メンバーで識別されるモジュール内のダイアログテンプレートリソースの名前。番号付きのダイアログボックスリソースの場合、これは MAKEINTRESOURCE マクロが返す値にできます。Flags メンバーに OFN_ENABLETEMPLATE フラグが設定されていない限り、このメンバーは無視されます。OFN_EXPLORER フラグが設定されている場合、システムは指定されたテンプレートを使用して、既定のエクスプローラースタイルのダイアログボックスの子となるダイアログボックスを作成します。OFN_EXPLORER フラグが設定されていない場合、システムはそのテンプレートを使用して、既定のダイアログボックスを置き換える旧スタイルのダイアログボックスを作成します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pvReserved | void* | 8/4 | +124 | +76 | このメンバーは予約済みです。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dwReserved | DWORD | 4 | +132 | +80 | このメンバーは予約済みです。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| FlagsEx | OPEN_FILENAME_FLAGS_EX | 4 | +136 | +84 | ダイアログボックスの初期化に使用できるビットフラグの組み合わせ。現在、このメンバーには 0 または次のフラグを指定できます。
|
公式ドキュメント
[Windows Vista 以降、開く および 名前を付けて保存 コモンダイアログボックスは Common Item Dialog に置き換えられました。コモンダイアログボックスライブラリのこれらのダイアログボックスではなく、Common Item Dialog API を使用することを推奨します。]
GetOpenFileName 関数および GetSaveFileName 関数が 開く または 名前を付けて保存 ダイアログボックスを初期化するために使用する情報を格納します。ユーザーがダイアログボックスを閉じると、システムはユーザーの選択に関する情報をこの構造体に返します。
解説(Remarks)
互換性上の理由から、Flags に OFN_ENABLEHOOK が設定され、かつ lStructSize が OPENFILENAME_SIZE_VERSION_400 である場合、プレースバーは非表示になります。
commdlg.h ヘッダーは OPENFILENAME を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版と Unicode 版を自動的に選択するエイリアスとして定義しています。エンコーディング中立のエイリアスと、エンコーディング中立でないコードを混在させて使用すると、不一致が生じてコンパイルエラーや実行時エラーの原因になることがあります。詳細については、Conventions for Function Prototypes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// OPENFILENAMEA (x64 140 / x86 88 バイト)
#pragma pack(push, 1)
typedef struct OPENFILENAMEA {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPSTR lpstrFilter;
LPSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPSTR lpstrFile;
DWORD nMaxFile;
LPSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPSTR lpstrInitialDir;
LPSTR lpstrTitle;
OPEN_FILENAME_FLAGS Flags;
WORD nFileOffset;
WORD nFileExtension;
LPSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPSTR lpTemplateName;
void* pvReserved;
DWORD dwReserved;
OPEN_FILENAME_FLAGS_EX FlagsEx;
} OPENFILENAMEA;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct OPENFILENAMEA
{
public uint lStructSize;
public IntPtr hwndOwner;
public IntPtr hInstance;
public IntPtr lpstrFilter;
public IntPtr lpstrCustomFilter;
public uint nMaxCustFilter;
public uint nFilterIndex;
public IntPtr lpstrFile;
public uint nMaxFile;
public IntPtr lpstrFileTitle;
public uint nMaxFileTitle;
public IntPtr lpstrInitialDir;
public IntPtr lpstrTitle;
public uint Flags;
public ushort nFileOffset;
public ushort nFileExtension;
public IntPtr lpstrDefExt;
public IntPtr lCustData;
public IntPtr lpfnHook;
public IntPtr lpTemplateName;
public IntPtr pvReserved;
public uint dwReserved;
public uint FlagsEx;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure OPENFILENAMEA
Public lStructSize As UInteger
Public hwndOwner As IntPtr
Public hInstance As IntPtr
Public lpstrFilter As IntPtr
Public lpstrCustomFilter As IntPtr
Public nMaxCustFilter As UInteger
Public nFilterIndex As UInteger
Public lpstrFile As IntPtr
Public nMaxFile As UInteger
Public lpstrFileTitle As IntPtr
Public nMaxFileTitle As UInteger
Public lpstrInitialDir As IntPtr
Public lpstrTitle As IntPtr
Public Flags As UInteger
Public nFileOffset As UShort
Public nFileExtension As UShort
Public lpstrDefExt As IntPtr
Public lCustData As IntPtr
Public lpfnHook As IntPtr
Public lpTemplateName As IntPtr
Public pvReserved As IntPtr
Public dwReserved As UInteger
Public FlagsEx As UInteger
End Structureimport ctypes
from ctypes import wintypes
class OPENFILENAMEA(ctypes.Structure):
_pack_ = 1
_fields_ = [
("lStructSize", wintypes.DWORD),
("hwndOwner", ctypes.c_void_p),
("hInstance", ctypes.c_void_p),
("lpstrFilter", ctypes.c_void_p),
("lpstrCustomFilter", ctypes.c_void_p),
("nMaxCustFilter", wintypes.DWORD),
("nFilterIndex", wintypes.DWORD),
("lpstrFile", ctypes.c_void_p),
("nMaxFile", wintypes.DWORD),
("lpstrFileTitle", ctypes.c_void_p),
("nMaxFileTitle", wintypes.DWORD),
("lpstrInitialDir", ctypes.c_void_p),
("lpstrTitle", ctypes.c_void_p),
("Flags", wintypes.DWORD),
("nFileOffset", ctypes.c_ushort),
("nFileExtension", ctypes.c_ushort),
("lpstrDefExt", ctypes.c_void_p),
("lCustData", ctypes.c_ssize_t),
("lpfnHook", ctypes.c_void_p),
("lpTemplateName", ctypes.c_void_p),
("pvReserved", ctypes.c_void_p),
("dwReserved", wintypes.DWORD),
("FlagsEx", wintypes.DWORD),
]#[repr(C, packed(1))]
pub struct OPENFILENAMEA {
pub lStructSize: u32,
pub hwndOwner: *mut core::ffi::c_void,
pub hInstance: *mut core::ffi::c_void,
pub lpstrFilter: *mut core::ffi::c_void,
pub lpstrCustomFilter: *mut core::ffi::c_void,
pub nMaxCustFilter: u32,
pub nFilterIndex: u32,
pub lpstrFile: *mut core::ffi::c_void,
pub nMaxFile: u32,
pub lpstrFileTitle: *mut core::ffi::c_void,
pub nMaxFileTitle: u32,
pub lpstrInitialDir: *mut core::ffi::c_void,
pub lpstrTitle: *mut core::ffi::c_void,
pub Flags: u32,
pub nFileOffset: u16,
pub nFileExtension: u16,
pub lpstrDefExt: *mut core::ffi::c_void,
pub lCustData: isize,
pub lpfnHook: *mut core::ffi::c_void,
pub lpTemplateName: *mut core::ffi::c_void,
pub pvReserved: *mut core::ffi::c_void,
pub dwReserved: u32,
pub FlagsEx: u32,
}import "golang.org/x/sys/windows"
type OPENFILENAMEA struct {
lStructSize uint32
hwndOwner uintptr
hInstance uintptr
lpstrFilter uintptr
lpstrCustomFilter uintptr
nMaxCustFilter uint32
nFilterIndex uint32
lpstrFile uintptr
nMaxFile uint32
lpstrFileTitle uintptr
nMaxFileTitle uint32
lpstrInitialDir uintptr
lpstrTitle uintptr
Flags uint32
nFileOffset uint16
nFileExtension uint16
lpstrDefExt uintptr
lCustData uintptr
lpfnHook uintptr
lpTemplateName uintptr
pvReserved uintptr
dwReserved uint32
FlagsEx uint32
}type
OPENFILENAMEA = packed record
lStructSize: DWORD;
hwndOwner: Pointer;
hInstance: Pointer;
lpstrFilter: Pointer;
lpstrCustomFilter: Pointer;
nMaxCustFilter: DWORD;
nFilterIndex: DWORD;
lpstrFile: Pointer;
nMaxFile: DWORD;
lpstrFileTitle: Pointer;
nMaxFileTitle: DWORD;
lpstrInitialDir: Pointer;
lpstrTitle: Pointer;
Flags: DWORD;
nFileOffset: Word;
nFileExtension: Word;
lpstrDefExt: Pointer;
lCustData: NativeInt;
lpfnHook: Pointer;
lpTemplateName: Pointer;
pvReserved: Pointer;
dwReserved: DWORD;
FlagsEx: DWORD;
end;const OPENFILENAMEA = extern struct {
lStructSize: u32,
hwndOwner: ?*anyopaque,
hInstance: ?*anyopaque,
lpstrFilter: ?*anyopaque,
lpstrCustomFilter: ?*anyopaque,
nMaxCustFilter: u32,
nFilterIndex: u32,
lpstrFile: ?*anyopaque,
nMaxFile: u32,
lpstrFileTitle: ?*anyopaque,
nMaxFileTitle: u32,
lpstrInitialDir: ?*anyopaque,
lpstrTitle: ?*anyopaque,
Flags: u32,
nFileOffset: u16,
nFileExtension: u16,
lpstrDefExt: ?*anyopaque,
lCustData: isize,
lpfnHook: ?*anyopaque,
lpTemplateName: ?*anyopaque,
pvReserved: ?*anyopaque,
dwReserved: u32,
FlagsEx: u32,
};type
OPENFILENAMEA {.packed.} = object
lStructSize: uint32
hwndOwner: pointer
hInstance: pointer
lpstrFilter: pointer
lpstrCustomFilter: pointer
nMaxCustFilter: uint32
nFilterIndex: uint32
lpstrFile: pointer
nMaxFile: uint32
lpstrFileTitle: pointer
nMaxFileTitle: uint32
lpstrInitialDir: pointer
lpstrTitle: pointer
Flags: uint32
nFileOffset: uint16
nFileExtension: uint16
lpstrDefExt: pointer
lCustData: int
lpfnHook: pointer
lpTemplateName: pointer
pvReserved: pointer
dwReserved: uint32
FlagsEx: uint32align(1)
struct OPENFILENAMEA
{
uint lStructSize;
void* hwndOwner;
void* hInstance;
void* lpstrFilter;
void* lpstrCustomFilter;
uint nMaxCustFilter;
uint nFilterIndex;
void* lpstrFile;
uint nMaxFile;
void* lpstrFileTitle;
uint nMaxFileTitle;
void* lpstrInitialDir;
void* lpstrTitle;
uint Flags;
ushort nFileOffset;
ushort nFileExtension;
void* lpstrDefExt;
ptrdiff_t lCustData;
void* lpfnHook;
void* lpTemplateName;
void* pvReserved;
uint dwReserved;
uint FlagsEx;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; OPENFILENAMEA サイズ: 88 バイト(x86)
dim st, 22 ; 4byte整数×22(構造体サイズ 88 / 4 切り上げ)
; lStructSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; hwndOwner : HWND (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; hInstance : HINSTANCE (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; lpstrFilter : LPSTR (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; lpstrCustomFilter : LPSTR (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; nMaxCustFilter : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; nFilterIndex : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; lpstrFile : LPSTR (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; nMaxFile : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; lpstrFileTitle : LPSTR (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; nMaxFileTitle : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; lpstrInitialDir : LPSTR (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; lpstrTitle : LPSTR (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; Flags : OPEN_FILENAME_FLAGS (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; nFileOffset : WORD (+56, 2byte) wpoke st,56,値 / 値 = wpeek(st,56)
; nFileExtension : WORD (+58, 2byte) wpoke st,58,値 / 値 = wpeek(st,58)
; lpstrDefExt : LPSTR (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; lCustData : LPARAM (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; lpfnHook : LPOFNHOOKPROC (+68, 4byte) st.17 = 値 / 値 = st.17 (lpoke/lpeek も可)
; lpTemplateName : LPSTR (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; pvReserved : void* (+76, 4byte) st.19 = 値 / 値 = st.19 (lpoke/lpeek も可)
; dwReserved : DWORD (+80, 4byte) st.20 = 値 / 値 = st.20 (lpoke/lpeek も可)
; FlagsEx : OPEN_FILENAME_FLAGS_EX (+84, 4byte) st.21 = 値 / 値 = st.21 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; OPENFILENAMEA サイズ: 140 バイト(x64)
dim st, 35 ; 4byte整数×35(構造体サイズ 140 / 4 切り上げ)
; lStructSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; hwndOwner : HWND (+4, 8byte) qpoke st,4,値 / qpeek(st,4) ※IronHSPのみ。3.7/3.8は lpoke st,4,下位 : lpoke st,8,上位
; hInstance : HINSTANCE (+12, 8byte) qpoke st,12,値 / qpeek(st,12) ※IronHSPのみ。3.7/3.8は lpoke st,12,下位 : lpoke st,16,上位
; lpstrFilter : LPSTR (+20, 8byte) qpoke st,20,値 / qpeek(st,20) ※IronHSPのみ。3.7/3.8は lpoke st,20,下位 : lpoke st,24,上位
; lpstrCustomFilter : LPSTR (+28, 8byte) qpoke st,28,値 / qpeek(st,28) ※IronHSPのみ。3.7/3.8は lpoke st,28,下位 : lpoke st,32,上位
; nMaxCustFilter : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; nFilterIndex : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; lpstrFile : LPSTR (+44, 8byte) qpoke st,44,値 / qpeek(st,44) ※IronHSPのみ。3.7/3.8は lpoke st,44,下位 : lpoke st,48,上位
; nMaxFile : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; lpstrFileTitle : LPSTR (+56, 8byte) qpoke st,56,値 / qpeek(st,56) ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; nMaxFileTitle : DWORD (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; lpstrInitialDir : LPSTR (+68, 8byte) qpoke st,68,値 / qpeek(st,68) ※IronHSPのみ。3.7/3.8は lpoke st,68,下位 : lpoke st,72,上位
; lpstrTitle : LPSTR (+76, 8byte) qpoke st,76,値 / qpeek(st,76) ※IronHSPのみ。3.7/3.8は lpoke st,76,下位 : lpoke st,80,上位
; Flags : OPEN_FILENAME_FLAGS (+84, 4byte) st.21 = 値 / 値 = st.21 (lpoke/lpeek も可)
; nFileOffset : WORD (+88, 2byte) wpoke st,88,値 / 値 = wpeek(st,88)
; nFileExtension : WORD (+90, 2byte) wpoke st,90,値 / 値 = wpeek(st,90)
; lpstrDefExt : LPSTR (+92, 8byte) qpoke st,92,値 / qpeek(st,92) ※IronHSPのみ。3.7/3.8は lpoke st,92,下位 : lpoke st,96,上位
; lCustData : LPARAM (+100, 8byte) qpoke st,100,値 / qpeek(st,100) ※IronHSPのみ。3.7/3.8は lpoke st,100,下位 : lpoke st,104,上位
; lpfnHook : LPOFNHOOKPROC (+108, 8byte) qpoke st,108,値 / qpeek(st,108) ※IronHSPのみ。3.7/3.8は lpoke st,108,下位 : lpoke st,112,上位
; lpTemplateName : LPSTR (+116, 8byte) qpoke st,116,値 / qpeek(st,116) ※IronHSPのみ。3.7/3.8は lpoke st,116,下位 : lpoke st,120,上位
; pvReserved : void* (+124, 8byte) qpoke st,124,値 / qpeek(st,124) ※IronHSPのみ。3.7/3.8は lpoke st,124,下位 : lpoke st,128,上位
; dwReserved : DWORD (+132, 4byte) st.33 = 値 / 値 = st.33 (lpoke/lpeek も可)
; FlagsEx : OPEN_FILENAME_FLAGS_EX (+136, 4byte) st.34 = 値 / 値 = st.34 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global OPENFILENAMEA, pack=1
#field int lStructSize
#field intptr hwndOwner
#field intptr hInstance
#field intptr lpstrFilter
#field intptr lpstrCustomFilter
#field int nMaxCustFilter
#field int nFilterIndex
#field intptr lpstrFile
#field int nMaxFile
#field intptr lpstrFileTitle
#field int nMaxFileTitle
#field intptr lpstrInitialDir
#field intptr lpstrTitle
#field int Flags
#field short nFileOffset
#field short nFileExtension
#field intptr lpstrDefExt
#field intptr lCustData
#field intptr lpfnHook
#field intptr lpTemplateName
#field intptr pvReserved
#field int dwReserved
#field int FlagsEx
#endstruct
stdim st, OPENFILENAMEA ; NSTRUCT 変数を確保
st->lStructSize = 100
mes "lStructSize=" + st->lStructSize