Win32 API 日本語リファレンス
ホームUI.Controls.Dialogs › OPENFILENAMEW

OPENFILENAMEW

構造体
サイズx64: 140 バイト / x86: 88 バイトパッキング1

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

フィールド

フィールドサイズx64x86説明
lStructSizeDWORD4+0+0構造体の長さ (バイト単位)。 このパラメーターには sizeof (OPENFILENAME) を使用します。
hwndOwnerHWND8/4+4+4ダイアログボックスを所有するウィンドウへのハンドル。このメンバーには任意の有効なウィンドウハンドルを指定できます。ダイアログボックスに所有者がいない場合は NULL でも構いません。
hInstanceHINSTANCE8/4+12+8Flags メンバーに OFN_ENABLETEMPLATEHANDLE フラグが設定されている場合、hInstance はダイアログボックステンプレートを含むメモリオブジェクトへのハンドルです。OFN_ENABLETEMPLATE フラグが設定されている場合、hInstancelpTemplateName メンバーで指定された名前のダイアログボックステンプレートを含むモジュールへのハンドルです。どちらのフラグも設定されていない場合、このメンバーは無視されます。OFN_EXPLORER フラグが設定されている場合、システムは指定されたテンプレートを使用して、既定のエクスプローラースタイルのダイアログボックスの子となるダイアログボックスを作成します。OFN_EXPLORER フラグが設定されていない場合、システムはそのテンプレートを使用して、既定のダイアログボックスを置き換える旧スタイルのダイアログボックスを作成します。
lpstrFilterLPWSTR8/4+20+12

null 終端のフィルター文字列のペアを格納したバッファー。バッファー内の最後の文字列は 2 つの NULL 文字で終端されていなければなりません。

各ペアの 1 番目の文字列はフィルターを説明する表示用文字列 (例: "Text Files")、2 番目の文字列はフィルターパターン (例: ".TXT") を指定します。1 つの表示用文字列に複数のフィルターパターンを指定するには、セミコロンでパターンを区切ります (例: ".TXT;.DOC;.BAK")。パターン文字列には、有効なファイル名文字とアスタリスク (*) ワイルドカード文字を組み合わせて指定できます。パターン文字列にスペースを含めないでください。

システムはフィルターの順序を変更しません。lpstrFilter で指定された順序どおりに ファイルの種類 コンボボックスに表示します。

lpstrFilterNULL の場合、ダイアログボックスはフィルターを表示しません。

ショートカットの場合、フィルターが設定されていないと、GetOpenFileNameGetSaveFileName はリンク先ではなく .lnk ファイルの名前を取得します。この動作は、Flags メンバーに OFN_NODEREFERENCELINKS フラグを設定した場合と同じです。フィルターを適用せずにショートカットのリンク先を取得するには、文字列 "All Files\0*.*\0\0" を使用します。

lpstrCustomFilterLPWSTR8/4+28+16

ユーザーが選択したフィルターパターンを保持するための、null 終端のフィルター文字列のペアを格納する静的バッファー。1 番目の文字列はカスタムフィルターを説明するアプリケーション側の表示用文字列で、2 番目の文字列はユーザーが選択したフィルターパターンです。アプリケーションが最初にダイアログボックスを作成するときは 1 番目の文字列を指定します。これは空でない任意の文字列で構いません。ユーザーがファイルを選択すると、ダイアログボックスは現在のフィルターパターンを 2 番目の文字列にコピーします。保持されるフィルターパターンは、lpstrFilter バッファーで指定されたパターンのいずれか、またはユーザーが入力したフィルターパターンです。システムはこれらの文字列を使用して、次にダイアログボックスが作成されるときにユーザー定義のファイルフィルターを初期化します。nFilterIndex メンバーが 0 の場合、ダイアログボックスはカスタムフィルターを使用します。

このメンバーが NULL の場合、ダイアログボックスはユーザー定義のフィルターパターンを保持しません。

このメンバーが NULL でない場合、nMaxCustFilter メンバーの値で lpstrCustomFilter バッファーのサイズを文字数単位で指定しなければなりません。

nMaxCustFilterDWORD4+36+20lpstrCustomFilter で指定されるバッファーのサイズ (文字数単位)。このバッファーは少なくとも 40 文字の長さが必要です。lpstrCustomFilterNULL であるか NULL 文字列を指している場合、このメンバーは無視されます。
nFilterIndexDWORD4+40+24ファイルの種類 コントロールで現在選択されているフィルターのインデックス。lpstrFilter が指すバッファーには、フィルターを定義する文字列のペアが格納されています。最初のペアのインデックス値は 1、2 番目のペアは 2、というように続きます。インデックス 0 は lpstrCustomFilter で指定されたカスタムフィルターを示します。入力時にインデックスを指定して、ダイアログボックスの初期フィルターの説明とフィルターパターンを示すことができます。ユーザーがファイルを選択すると、nFilterIndex には現在表示されているフィルターのインデックスが返されます。nFilterIndex が 0 で lpstrCustomFilterNULL の場合、システムは lpstrFilter バッファー内の最初のフィルターを使用します。これら 3 つのメンバーがすべて 0 または NULL の場合、システムはフィルターを一切使用せず、ダイアログボックスのファイル一覧コントロールにファイルを表示しません。
lpstrFileLPWSTR8/4+44+28

ファイル名 エディットコントロールの初期化に使用されるファイル名。初期化が不要な場合、このバッファーの最初の文字は NULL でなければなりません。GetOpenFileName 関数または GetSaveFileName 関数が正常に戻ると、このバッファーには選択されたファイルのドライブ指定子、パス、ファイル名、拡張子が格納されます。

OFN_ALLOWMULTISELECT フラグが設定されていて、ユーザーが複数のファイルを選択した場合、バッファーには現在のディレクトリに続いて選択されたファイルのファイル名が格納されます。エクスプローラースタイルのダイアログボックスでは、ディレクトリとファイル名の文字列は NULL で区切られ、最後のファイル名の後にさらに NULL 文字が 1 つ付きます。旧スタイルのダイアログボックスでは、文字列はスペースで区切られ、スペースを含むファイル名には短いファイル名が使用されます。長いファイル名と短いファイル名の変換には FindFirstFile 関数を使用できます。ユーザーが 1 つのファイルだけを選択した場合、lpstrFile 文字列のパスとファイル名の間に区切り文字は入りません。

バッファーが小さすぎる場合、関数は FALSE を返し、CommDlgExtendedError 関数は FNERR_BUFFERTOOSMALL を返します。この場合、lpstrFile バッファーの最初の 2 バイトに必要なサイズ (バイト単位または文字数単位) が格納されます。

nMaxFileDWORD4+52+32lpstrFile が指すバッファーのサイズ (文字数単位)。バッファーは、終端の NULL 文字を含めてパスとファイル名の文字列を格納できる大きさでなければなりません。バッファーがファイル情報を格納するには小さすぎる場合、GetOpenFileName 関数と GetSaveFileName 関数は FALSE を返します。バッファーは少なくとも 256 文字の長さが必要です。
lpstrFileTitleLPWSTR8/4+56+36選択されたファイルのファイル名と拡張子 (パス情報を含まない)。このメンバーは NULL でも構いません。
nMaxFileTitleDWORD4+64+40lpstrFileTitle が指すバッファーのサイズ (文字数単位)。lpstrFileTitleNULL の場合、このメンバーは無視されます。
lpstrInitialDirLPWSTR8/4+68+44

初期ディレクトリ。初期ディレクトリを選択するアルゴリズムはプラットフォームによって異なります。

Windows 7:

  1. アプリケーションが最初に 開く または 名前を付けて保存 ダイアログボックスを使用したときに渡した値と lpstrInitialDir が同じ場合、ユーザーが最後に選択したパスが初期ディレクトリとして使用されます。
  2. それ以外の場合で、lpstrFile にパスが含まれていれば、そのパスが初期ディレクトリになります。
  3. それ以外の場合で、lpstrInitialDirNULL でなければ、それが初期ディレクトリを指定します。
  4. lpstrInitialDirNULL で、現在のディレクトリに指定されたフィルターの種類のファイルが存在する場合、初期ディレクトリは現在のディレクトリになります。
  5. それ以外の場合、初期ディレクトリは現在のユーザーの個人用ファイルディレクトリになります。
  6. それ以外の場合、初期ディレクトリはデスクトップフォルダーになります。
Windows 2000/XP/Vista:
  1. lpstrFile にパスが含まれている場合、そのパスが初期ディレクトリになります。
  2. それ以外の場合、lpstrInitialDir が初期ディレクトリを指定します。
  3. それ以外の場合で、アプリケーションが過去に 開く または 名前を付けて保存 ダイアログボックスを使用したことがあれば、最後に使用したパスが初期ディレクトリとして選択されます。ただし、アプリケーションが長期間実行されていない場合、保存されていた選択パスは破棄されます。
  4. lpstrInitialDirNULL で、現在のディレクトリに指定されたフィルターの種類のファイルが存在する場合、初期ディレクトリは現在のディレクトリになります。
  5. それ以外の場合、初期ディレクトリは現在のユーザーの個人用ファイルディレクトリになります。
  6. それ以外の場合、初期ディレクトリはデスクトップフォルダーになります。
lpstrTitleLPWSTR8/4+76+48ダイアログボックスのタイトルバーに表示する文字列。このメンバーが NULL の場合、システムは既定のタイトル (すなわち 名前を付けて保存 または 開く) を使用します。
FlagsOPEN_FILENAME_FLAGS4+84+52

ダイアログボックスの初期化に使用できるビットフラグのセット。ダイアログボックスが戻るとき、これらのフラグにはユーザーの入力を示す値が設定されます。このメンバーには次のフラグの組み合わせを指定できます。

意味
OFN_ALLOWMULTISELECT
0x00000200
ファイル名 リストボックスで複数選択が可能になります。OFN_EXPLORER フラグも設定した場合、ダイアログボックスはエクスプローラースタイルのユーザーインターフェイスを使用します。設定しない場合は旧スタイルのユーザーインターフェイスを使用します。

ユーザーが複数のファイルを選択した場合、lpstrFile バッファーには現在のディレクトリへのパスに続いて選択されたファイルのファイル名が返されます。nFileOffset メンバーは最初のファイル名までのオフセット (バイト単位または文字数単位) であり、nFileExtension メンバーは使用されません。エクスプローラースタイルのダイアログボックスでは、ディレクトリとファイル名の文字列は NULL で区切られ、最後のファイル名の後にさらに NULL 文字が 1 つ付きます。この形式により、エクスプローラースタイルのダイアログボックスはスペースを含む長いファイル名を返すことができます。旧スタイルのダイアログボックスでは、ディレクトリとファイル名の文字列はスペースで区切られ、スペースを含むファイル名には短いファイル名が使用されます。長いファイル名と短いファイル名の変換には FindFirstFile 関数を使用できます。

旧スタイルのダイアログボックスにカスタムテンプレートを指定する場合、ファイル名 リストボックスの定義に LBS_EXTENDEDSEL の値を含めなければなりません。

OFN_CREATEPROMPT
0x00002000
存在しないファイルをユーザーが指定した場合、このフラグはダイアログボックスにファイル作成の許可を求めるプロンプトを表示させます。ユーザーがファイルの作成を選択すると、ダイアログボックスは閉じ、関数は指定された名前を返します。それ以外の場合、ダイアログボックスは開いたままになります。このフラグを OFN_ALLOWMULTISELECT フラグと組み合わせて使用する場合、ダイアログボックスでは存在しないファイルを 1 つだけ指定できます。
OFN_DONTADDTORECENT
0x02000000
ユーザーの最近使用したドキュメントを格納するファイルシステムディレクトリに、選択されたファイルへのリンクをシステムが追加しないようにします。このディレクトリの場所を取得するには、CSIDL_RECENT フラグを指定して SHGetSpecialFolderLocation 関数を呼び出します。
OFN_ENABLEHOOK
0x00000020
lpfnHook メンバーで指定されたフック関数を有効にします。
OFN_ENABLEINCLUDENOTIFY
0x00400000
ユーザーがフォルダーを開いたときに、ダイアログボックスが CDN_INCLUDEITEM 通知メッセージを OFNHookProc フックプロシージャに送信するようにします。ダイアログボックスは、新しく開かれたフォルダー内の項目ごとに通知を送信します。これらのメッセージにより、ダイアログボックスがフォルダーの項目一覧に表示する項目を制御できます。
OFN_ENABLESIZING
0x00800000
エクスプローラースタイルのダイアログボックスを、マウスまたはキーボードでサイズ変更できるようにします。既定では、エクスプローラースタイルの 開く および 名前を付けて保存 ダイアログボックスは、このフラグが設定されているかどうかに関係なくサイズ変更が可能です。このフラグが必要になるのは、フックプロシージャまたはカスタムテンプレートを提供する場合だけです。旧スタイルのダイアログボックスはサイズ変更できません。
OFN_ENABLETEMPLATE
0x00000040
lpTemplateName メンバーは、 hInstance メンバーで識別されるモジュール内のダイアログテンプレートリソースの名前へのポインターです。OFN_EXPLORER フラグが設定されている場合、システムは指定されたテンプレートを使用して、既定のエクスプローラースタイルのダイアログボックスの子となるダイアログボックスを作成します。OFN_EXPLORER フラグが設定されていない場合、システムはそのテンプレートを使用して、既定のダイアログボックスを置き換える旧スタイルのダイアログボックスを作成します。
OFN_ENABLETEMPLATEHANDLE
0x00000080
hInstance メンバーは、あらかじめ読み込まれたダイアログボックステンプレートを含むデータブロックを識別します。このフラグが指定されている場合、システムは lpTemplateName を無視します。OFN_EXPLORER フラグが設定されている場合、システムは指定されたテンプレートを使用して、既定のエクスプローラースタイルのダイアログボックスの子となるダイアログボックスを作成します。OFN_EXPLORER フラグが設定されていない場合、システムはそのテンプレートを使用して、既定のダイアログボックスを置き換える旧スタイルのダイアログボックスを作成します。
OFN_EXPLORER
0x00080000
開く または 名前を付けて保存 ダイアログボックスに対して行うカスタマイズが、エクスプローラースタイルのカスタマイズ方法を使用することを示します。詳細については、エクスプローラースタイルのフックプロシージャおよび エクスプローラースタイルのカスタムテンプレート を参照してください。

既定では、開く および 名前を付けて保存 ダイアログボックスは、このフラグが設定されているかどうかに関係なくエクスプローラースタイルのユーザーインターフェイスを使用します。このフラグが必要になるのは、フックプロシージャまたはカスタムテンプレートを提供する場合、あるいは OFN_ALLOWMULTISELECT フラグを設定する場合だけです。

旧スタイルのユーザーインターフェイスが必要な場合は、OFN_EXPLORER フラグを省略し、置き換え用の旧スタイルのテンプレートまたはフックプロシージャを提供します。旧スタイルが必要でカスタムテンプレートやフックプロシージャが不要な場合は、常に FALSE を返すフックプロシージャを提供するだけで済みます。

OFN_EXTENSIONDIFFERENT
0x00000400
ユーザーが lpstrDefExt で指定された拡張子とは異なるファイル名拡張子を入力しました。lpstrDefExtNULL の場合、関数はこのフラグを使用しません。
OFN_FILEMUSTEXIST
0x00001000
ユーザーは ファイル名 入力フィールドに既存のファイルの名前しか入力できません。このフラグが指定されていて、ユーザーが無効な名前を入力した場合、ダイアログボックスプロシージャはメッセージボックスに警告を表示します。このフラグが指定されている場合、OFN_PATHMUSTEXIST フラグも併せて使用されます。このフラグは 開く ダイアログボックスで使用できます。名前を付けて保存 ダイアログボックスでは使用できません。
OFN_FORCESHOWHIDDEN
0x10000000
システムファイルと隠しファイルを強制的に表示し、隠しファイルを表示するかどうかのユーザー設定を上書きします。ただし、システムと隠しの両方が設定されているファイルは表示されません。
OFN_HIDEREADONLY
0x00000004
読み取り専用 チェックボックスを非表示にします。
OFN_LONGNAMES
0x00200000
旧スタイルのダイアログボックスでは、このフラグによりダイアログボックスが長いファイル名を使用します。このフラグが指定されていない場合、または OFN_ALLOWMULTISELECT フラグも設定されている場合、旧スタイルのダイアログボックスはスペースを含むファイル名に短いファイル名 (8.3 形式) を使用します。エクスプローラースタイルのダイアログボックスはこのフラグを無視し、常に長いファイル名を表示します。
OFN_NOCHANGEDIR
0x00000008
ユーザーがファイルの検索中にディレクトリを変更した場合、現在のディレクトリを元の値に戻します。

このフラグは GetOpenFileName では効果がありません。

OFN_NODEREFERENCELINKS
0x00100000
選択されたショートカット (.LNK) ファイルのパスとファイル名を返すようダイアログボックスに指示します。この値が指定されていない場合、ダイアログボックスはショートカットが参照するファイルのパスとファイル名を返します。
OFN_NOLONGNAMES
0x00040000
旧スタイルのダイアログボックスでは、このフラグによりダイアログボックスが短いファイル名 (8.3 形式) を使用します。エクスプローラースタイルのダイアログボックスはこのフラグを無視し、常に長いファイル名を表示します。
OFN_NONETWORKBUTTON
0x00020000
ネットワーク ボタンを非表示にし、無効にします。
OFN_NOREADONLYRETURN
0x00008000
返されるファイルは、読み取り専用 チェックボックスが選択されておらず、書き込み保護されたディレクトリにも存在しません。
OFN_NOTESTFILECREATE
0x00010000
ダイアログボックスが閉じられる前にファイルは作成されません。アプリケーションが create-nonmodify のネットワーク共有にファイルを保存する場合は、このフラグを指定してください。アプリケーションがこのフラグを指定すると、ライブラリは書き込み保護、ディスクの空き容量不足、ドライブのドアの開放、ネットワーク保護のチェックを行いません。ファイルはいったん閉じると再度開けないことがあるため、このフラグを使用するアプリケーションはファイル操作を慎重に行う必要があります。
OFN_NOVALIDATE
0x00000100
コモンダイアログボックスは、返されるファイル名に無効な文字を許可します。通常、呼び出し元のアプリケーションは FILEOKSTRING メッセージを使用してファイル名をチェックするフックプロシージャを使用します。エディットコントロールのテキストボックスが空であるか、スペースだけを含む場合、ファイルとディレクトリの一覧が更新されます。エディットコントロールのテキストボックスにそれ以外の内容が含まれている場合、nFileOffsetnFileExtension にはテキストを解析して生成された値が設定されます。テキストに既定の拡張子が追加されることはなく、lpstrFileTitle で指定されたバッファーにテキストがコピーされることもありません。nFileOffset で指定される値が 0 未満の場合、ファイル名は無効です。それ以外の場合、ファイル名は有効であり、OFN_NOVALIDATE フラグが指定されていなかった場合と同様に nFileExtensionnFileOffset を使用できます。
OFN_OVERWRITEPROMPT
0x00000002
選択されたファイルが既に存在する場合に、名前を付けて保存 ダイアログボックスがメッセージボックスを表示するようにします。ユーザーはファイルを上書きするかどうかを確認しなければなりません。
OFN_PATHMUSTEXIST
0x00000800
ユーザーは有効なパスとファイル名しか入力できません。このフラグが使用されていて、ユーザーが ファイル名 入力フィールドに無効なパスとファイル名を入力した場合、ダイアログボックス関数はメッセージボックスに警告を表示します。
OFN_READONLY
0x00000001
ダイアログボックスの作成時に 読み取り専用 チェックボックスが初期状態で選択されるようにします。ダイアログボックスが閉じられたとき、このフラグは 読み取り専用 チェックボックスの状態を示します。
OFN_SHAREAWARE
0x00004000
OpenFile 関数の呼び出しがネットワーク共有違反により失敗した場合に、そのエラーを無視して、選択されたファイル名をダイアログボックスが返すことを指定します。このフラグが設定されていない場合、ユーザーが指定したファイル名についてネットワーク共有違反が発生すると、ダイアログボックスはフックプロシージャに通知します。OFN_EXPLORER フラグを設定している場合、ダイアログボックスはフックプロシージャに CDN_SHAREVIOLATION メッセージを送信します。OFN_EXPLORER を設定していない場合、ダイアログボックスはフックプロシージャに登録メッセージ SHAREVISTRING を送信します。
OFN_SHOWHELP
0x00000010
ダイアログボックスに ヘルプ ボタンを表示させます。hwndOwner メンバーには、ユーザーが ヘルプ ボタンをクリックしたときにダイアログボックスが送信する登録メッセージ HELPMSGSTRING を受け取るウィンドウを指定しなければなりません。エクスプローラースタイルのダイアログボックスは、ユーザーが ヘルプ ボタンをクリックすると CDN_HELP 通知メッセージをフックプロシージャに送信します。
nFileOffsetWORD2+88+56lpstrFile が指す文字列内で、パスの先頭からファイル名までの 0 から始まるオフセット (文字数単位)。ANSI 版ではバイト数、Unicode 版では文字数になります。たとえば、lpstrFile が文字列 "c:\dir1\dir2\file.ext" を指している場合、このメンバーには "file.ext" という文字列のオフセットを示す値 13 が格納されます。ユーザーが複数のファイルを選択した場合、nFileOffset は最初のファイル名までのオフセットになります。
nFileExtensionWORD2+90+58lpstrFile が指す文字列内で、パスの先頭からファイル名拡張子までの 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 が格納されます。
lpstrDefExtLPWSTR8/4+92+60既定の拡張子。ユーザーが拡張子を入力しなかった場合、GetOpenFileNameGetSaveFileName はこの拡張子をファイル名に付加します。この文字列の長さは任意ですが、付加されるのは最初の 3 文字だけです。文字列にピリオド (.) を含めないでください。このメンバーが NULL で、ユーザーが拡張子を入力しなかった場合、拡張子は付加されません。
lCustDataLPARAM8/4+100+64lpfnHook メンバーで識別されるフックプロシージャにシステムが渡す、アプリケーション定義のデータ。システムがフックプロシージャに WM_INITDIALOG メッセージを送信するとき、メッセージの lParam パラメーターは、ダイアログボックスの作成時に指定された OPENFILENAME 構造体へのポインターです。フックプロシージャはこのポインターを使用して lCustData の値を取得できます。
lpfnHookLPOFNHOOKPROC8/4+108+68

フックプロシージャへのポインター。Flags メンバーに OFN_ENABLEHOOK フラグが含まれていない限り、このメンバーは無視されます。

Flags メンバーに OFN_EXPLORER フラグが設定されていない場合、lpfnHook は、ダイアログボックス宛てのメッセージを受け取る OFNHookProcOldStyle フックプロシージャへのポインターです。フックプロシージャは、メッセージを既定のダイアログボックスプロシージャに渡す場合は FALSE を、メッセージを破棄する場合は TRUE を返します。

OFN_EXPLORER が設定されている場合、lpfnHookOFNHookProc フックプロシージャへのポインターです。フックプロシージャは、ダイアログボックスから送信される通知メッセージを受け取ります。また、子ダイアログテンプレートを指定して定義した追加のコントロールに対するメッセージも受け取ります。フックプロシージャは、既定のダイアログボックスの標準コントロール宛てのメッセージは受け取りません。

lpTemplateNameLPWSTR8/4+116+72hInstance メンバーで識別されるモジュール内のダイアログテンプレートリソースの名前。番号付きのダイアログボックスリソースの場合、これは MAKEINTRESOURCE マクロが返す値でも構いません。Flags メンバーに OFN_ENABLETEMPLATE フラグが設定されていない限り、このメンバーは無視されます。OFN_EXPLORER フラグが設定されている場合、システムは指定されたテンプレートを使用して、既定のエクスプローラースタイルのダイアログボックスの子となるダイアログボックスを作成します。OFN_EXPLORER フラグが設定されていない場合、システムはそのテンプレートを使用して、既定のダイアログボックスを置き換える旧スタイルのダイアログボックスを作成します。
pvReservedvoid*8/4+124+76このメンバーは予約済みです。
dwReservedDWORD4+132+80このメンバーは予約済みです。
FlagsExOPEN_FILENAME_FLAGS_EX4+136+84

ダイアログボックスの初期化に使用できるビットフラグのセット。現在、このメンバーには 0 または次のフラグを指定できます。

意味
OFN_EX_NOPLACESBAR
0x00000001
このフラグが設定されている場合、プレースバーは表示されません。このフラグが設定されていない場合、エクスプローラースタイルのダイアログボックスには、お気に入りやデスクトップなどのよく使うフォルダーのアイコンを含むプレースバーが表示されます。

公式ドキュメント

[Windows Vista 以降、開く および 名前を付けて保存 のコモンダイアログボックスは Common Item Dialog に置き換えられました。コモンダイアログボックスライブラリのこれらのダイアログボックスではなく、Common Item Dialog API を使用することをお勧めします。]

GetOpenFileName 関数および GetSaveFileName 関数が 開く または 名前を付けて保存 ダイアログボックスを初期化するために使用する情報を格納します。ユーザーがダイアログボックスを閉じた後、システムはユーザーの選択に関する情報をこの構造体に返します。

解説(Remarks)

互換性上の理由から、FlagsOFN_ENABLEHOOK が設定されていて、lStructSizeOPENFILENAME_SIZE_VERSION_400 の場合、プレースバーは非表示になります。

メモ

commdlg.h ヘッダーは OPENFILENAME を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義します。エンコーディング中立のエイリアスと、エンコーディング中立でないコードを混在させて使用すると、不一致が生じてコンパイルエラーや実行時エラーの原因になることがあります。詳細については、関数プロトタイプの規則を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 Structure
import 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: uint32
align(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