OPENFILENAMEW
構造体サイズ=各フィールドのバイト数(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 | LPWSTR | 8/4 | +20 | +12 | null 終端のフィルター文字列のペアを格納したバッファー。バッファー内の最後の文字列は 2 つの NULL 文字で終端されていなければなりません。 各ペアの 1 番目の文字列はフィルターを説明する表示用文字列 (例: "Text Files")、2 番目の文字列はフィルターパターン (例: ".TXT") を指定します。1 つの表示用文字列に複数のフィルターパターンを指定するには、セミコロンでパターンを区切ります (例: ".TXT;.DOC;.BAK")。パターン文字列には、有効なファイル名文字とアスタリスク (*) ワイルドカード文字を組み合わせて指定できます。パターン文字列にスペースを含めないでください。 システムはフィルターの順序を変更しません。lpstrFilter で指定された順序どおりに ファイルの種類 コンボボックスに表示します。 lpstrFilter が NULL の場合、ダイアログボックスはフィルターを表示しません。 ショートカットの場合、フィルターが設定されていないと、GetOpenFileName と GetSaveFileName はリンク先ではなく .lnk ファイルの名前を取得します。この動作は、Flags メンバーに OFN_NODEREFERENCELINKS フラグを設定した場合と同じです。フィルターを適用せずにショートカットのリンク先を取得するには、文字列 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrCustomFilter | LPWSTR | 8/4 | +28 | +16 | ユーザーが選択したフィルターパターンを保持するための、null 終端のフィルター文字列のペアを格納する静的バッファー。1 番目の文字列はカスタムフィルターを説明するアプリケーション側の表示用文字列で、2 番目の文字列はユーザーが選択したフィルターパターンです。アプリケーションが最初にダイアログボックスを作成するときは 1 番目の文字列を指定します。これは空でない任意の文字列で構いません。ユーザーがファイルを選択すると、ダイアログボックスは現在のフィルターパターンを 2 番目の文字列にコピーします。保持されるフィルターパターンは、lpstrFilter バッファーで指定されたパターンのいずれか、またはユーザーが入力したフィルターパターンです。システムはこれらの文字列を使用して、次にダイアログボックスが作成されるときにユーザー定義のファイルフィルターを初期化します。nFilterIndex メンバーが 0 の場合、ダイアログボックスはカスタムフィルターを使用します。 このメンバーが NULL の場合、ダイアログボックスはユーザー定義のフィルターパターンを保持しません。 このメンバーが NULL でない場合、nMaxCustFilter メンバーの値で lpstrCustomFilter バッファーのサイズを文字数単位で指定しなければなりません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nMaxCustFilter | DWORD | 4 | +36 | +20 | lpstrCustomFilter で指定されるバッファーのサイズ (文字数単位)。このバッファーは少なくとも 40 文字の長さが必要です。lpstrCustomFilter が NULL であるか NULL 文字列を指している場合、このメンバーは無視されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nFilterIndex | DWORD | 4 | +40 | +24 | ファイルの種類 コントロールで現在選択されているフィルターのインデックス。lpstrFilter が指すバッファーには、フィルターを定義する文字列のペアが格納されています。最初のペアのインデックス値は 1、2 番目のペアは 2、というように続きます。インデックス 0 は lpstrCustomFilter で指定されたカスタムフィルターを示します。入力時にインデックスを指定して、ダイアログボックスの初期フィルターの説明とフィルターパターンを示すことができます。ユーザーがファイルを選択すると、nFilterIndex には現在表示されているフィルターのインデックスが返されます。nFilterIndex が 0 で lpstrCustomFilter が NULL の場合、システムは lpstrFilter バッファー内の最初のフィルターを使用します。これら 3 つのメンバーがすべて 0 または NULL の場合、システムはフィルターを一切使用せず、ダイアログボックスのファイル一覧コントロールにファイルを表示しません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrFile | LPWSTR | 8/4 | +44 | +28 | ファイル名 エディットコントロールの初期化に使用されるファイル名。初期化が不要な場合、このバッファーの最初の文字は NULL でなければなりません。GetOpenFileName 関数または GetSaveFileName 関数が正常に戻ると、このバッファーには選択されたファイルのドライブ指定子、パス、ファイル名、拡張子が格納されます。 OFN_ALLOWMULTISELECT フラグが設定されていて、ユーザーが複数のファイルを選択した場合、バッファーには現在のディレクトリに続いて選択されたファイルのファイル名が格納されます。エクスプローラースタイルのダイアログボックスでは、ディレクトリとファイル名の文字列は NULL で区切られ、最後のファイル名の後にさらに NULL 文字が 1 つ付きます。旧スタイルのダイアログボックスでは、文字列はスペースで区切られ、スペースを含むファイル名には短いファイル名が使用されます。長いファイル名と短いファイル名の変換には FindFirstFile 関数を使用できます。ユーザーが 1 つのファイルだけを選択した場合、lpstrFile 文字列のパスとファイル名の間に区切り文字は入りません。 バッファーが小さすぎる場合、関数は FALSE を返し、CommDlgExtendedError 関数は FNERR_BUFFERTOOSMALL を返します。この場合、lpstrFile バッファーの最初の 2 バイトに必要なサイズ (バイト単位または文字数単位) が格納されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nMaxFile | DWORD | 4 | +52 | +32 | lpstrFile が指すバッファーのサイズ (文字数単位)。バッファーは、終端の NULL 文字を含めてパスとファイル名の文字列を格納できる大きさでなければなりません。バッファーがファイル情報を格納するには小さすぎる場合、GetOpenFileName 関数と GetSaveFileName 関数は FALSE を返します。バッファーは少なくとも 256 文字の長さが必要です。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrFileTitle | LPWSTR | 8/4 | +56 | +36 | 選択されたファイルのファイル名と拡張子 (パス情報を含まない)。このメンバーは NULL でも構いません。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nMaxFileTitle | DWORD | 4 | +64 | +40 | lpstrFileTitle が指すバッファーのサイズ (文字数単位)。lpstrFileTitle が NULL の場合、このメンバーは無視されます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrInitialDir | LPWSTR | 8/4 | +68 | +44 | 初期ディレクトリ。初期ディレクトリを選択するアルゴリズムはプラットフォームによって異なります。 Windows 7:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lpstrTitle | LPWSTR | 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 | LPWSTR | 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 | LPWSTR | 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 版を自動的に選択するエイリアスとして定義します。エンコーディング中立のエイリアスと、エンコーディング中立でないコードを混在させて使用すると、不一致が生じてコンパイルエラーや実行時エラーの原因になることがあります。詳細については、関数プロトタイプの規則を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// OPENFILENAMEW (x64 140 / x86 88 バイト)
#pragma pack(push, 1)
typedef struct OPENFILENAMEW {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPWSTR lpstrFilter;
LPWSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPWSTR lpstrFile;
DWORD nMaxFile;
LPWSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPWSTR lpstrInitialDir;
LPWSTR lpstrTitle;
OPEN_FILENAME_FLAGS Flags;
WORD nFileOffset;
WORD nFileExtension;
LPWSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPWSTR lpTemplateName;
void* pvReserved;
DWORD dwReserved;
OPEN_FILENAME_FLAGS_EX FlagsEx;
} OPENFILENAMEW;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct OPENFILENAMEW
{
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 OPENFILENAMEW
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 OPENFILENAMEW(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 OPENFILENAMEW {
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 OPENFILENAMEW 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
OPENFILENAMEW = 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 OPENFILENAMEW = 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
OPENFILENAMEW {.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 OPENFILENAMEW
{
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 レイアウト)
; OPENFILENAMEW サイズ: 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 : LPWSTR (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; lpstrCustomFilter : LPWSTR (+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 : LPWSTR (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; nMaxFile : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; lpstrFileTitle : LPWSTR (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; nMaxFileTitle : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; lpstrInitialDir : LPWSTR (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; lpstrTitle : LPWSTR (+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 : LPWSTR (+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 : LPWSTR (+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 レイアウト)
; OPENFILENAMEW サイズ: 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 : LPWSTR (+20, 8byte) qpoke st,20,値 / qpeek(st,20) ※IronHSPのみ。3.7/3.8は lpoke st,20,下位 : lpoke st,24,上位
; lpstrCustomFilter : LPWSTR (+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 : LPWSTR (+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 : LPWSTR (+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 : LPWSTR (+68, 8byte) qpoke st,68,値 / qpeek(st,68) ※IronHSPのみ。3.7/3.8は lpoke st,68,下位 : lpoke st,72,上位
; lpstrTitle : LPWSTR (+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 : LPWSTR (+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 : LPWSTR (+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 OPENFILENAMEW, 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, OPENFILENAMEW ; NSTRUCT 変数を確保
st->lStructSize = 100
mes "lStructSize=" + st->lStructSize