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

PRINTDLGEXW

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

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

フィールド

フィールドサイズx64x86説明
lStructSizeDWORD4+0+0構造体のサイズ (バイト単位)。
hwndOwnerHWND8/4+4+4プロパティシートを所有するウィンドウへのハンドル。このメンバーは有効なウィンドウハンドルでなければなりません。NULL にすることはできません。
hDevModeHGLOBAL8/4+12+8

DEVMODE 構造体を格納する移動可能なグローバルメモリオブジェクトへのハンドル。入力時に hDevModeNULL でない場合は、DEVMODE 構造体用に移動可能なメモリブロックを割り当て、そのメンバーを初期化する必要があります。PrintDlgEx 関数は、この入力データを使用してプロパティシート内のコントロールを初期化します。PrintDlgEx から制御が戻ると、DEVMODE の各メンバーはユーザーの入力内容を示します。

入力時に hDevModeNULL の場合、PrintDlgExDEVMODE 構造体のメモリを割り当て、そのメンバーをユーザーの入力内容を示すように初期化して、それを識別するハンドルを返します。

hDevMode メンバーと hDevNames メンバーの詳細については、このトピックの末尾にある「解説」セクションを参照してください。

hDevNamesHGLOBAL8/4+20+12

DEVNAMES 構造体を格納する移動可能なグローバルメモリオブジェクトへのハンドル。入力時に hDevNamesNULL でない場合は、DEVNAMES 構造体用に移動可能なメモリブロックを割り当て、そのメンバーを初期化する必要があります。PrintDlgEx 関数は、この入力データを使用してプロパティシート内のコントロールを初期化します。PrintDlgEx から制御が戻ると、DEVNAMES の各メンバーにはユーザーが選択したプリンターの情報が格納されます。この情報を使用して、デバイスコンテキストまたは情報コンテキストを作成できます。

hDevNames メンバーは NULL でもかまいません。その場合、PrintDlgExDEVNAMES 構造体のメモリを割り当て、そのメンバーをユーザーの入力内容を示すように初期化して、それを識別するハンドルを返します。

hDevMode メンバーと hDevNames メンバーの詳細については、このトピックの末尾にある「解説」セクションを参照してください。

hDCHDC8/4+28+16Flags メンバーで PD_RETURNDCPC_RETURNIC のどちらのフラグを指定したかに応じた、デバイスコンテキストまたは情報コンテキストへのハンドル。どちらのフラグも指定しなかった場合、このメンバーの値は未定義です。両方のフラグを指定した場合は PD_RETURNDC が優先されます。
FlagsPRINTDLGEX_FLAGS4+36+20

印刷 プロパティシートの初期化に使用できるビットフラグのセット。PrintDlgEx 関数から制御が戻るときには、ユーザーの入力内容を示すようにこれらのフラグが設定されます。このメンバーには、次の値のうち 1 つ以上を指定できます。

PrintDlg または PrintDlgExDEVMODE 構造体の dmCopies メンバーと dmCollate メンバーに正しい値を返すようにするには、PD_RETURNDC = TRUEPD_USEDEVMODECOPIESANDCOLLATE = TRUE に設定します。この場合、PRINTDLG 構造体の nCopies メンバーは常に 1 になり、PD_COLLATE は常に FALSE になります。

PrintDlg または PrintDlgExnCopiesPD_COLLATE に正しい値を返すようにするには、PD_RETURNDC = TRUEPD_USEDEVMODECOPIESANDCOLLATE = FALSE に設定します。この場合、dmCopies は常に 1 になり、dmCollate は常に FALSE になります。

Windows Vista 以降では、PD_RETURNDCTRUEPD_USEDEVMODECOPIESANDCOLLATEFALSE に設定して PrintDlg または PrintDlgEx を呼び出すと、PrintDlg 関数または PrintDlgEx 関数は PRINTDLG 構造体の nCopies メンバーに部数を設定し、さらに PRINTDLG 構造体の hDC メンバーが表す構造体にも部数を設定します。

GDI を呼び出す際は、同じコピーが重複して印刷されるのを避けるため、nCopies の値を無視して 1 とみなし、返された hDC を使用してください。

意味
PD_ALLPAGES
0x00000000
すべて ラジオボタンが最初に選択されることを示す既定のフラグです。このフラグは、PD_PAGENUMSPD_SELECTIONPD_CURRENTPAGE の各フラグが指定されていないことを示すプレースホルダーとして使用されます。
PD_COLLATE
0x00000010
このフラグが設定されている場合、部単位で印刷 チェックボックスが選択されます。

PrintDlgEx 関数から制御が戻った時点でこのフラグが設定されている場合、アプリケーションは複数部の部単位印刷を自前でシミュレートする必要があります。詳細については、PD_USEDEVMODECOPIESANDCOLLATE フラグの説明を参照してください。

PD_NOPAGENUMS を参照してください。

PD_CURRENTPAGE
0x00400000
このフラグが設定されている場合、現在のページ ラジオボタンが選択されます。PD_PAGENUMSPD_SELECTIONPD_CURRENTPAGE のいずれのフラグも設定されていない場合は、すべて ラジオボタンが選択されます。
PD_DISABLEPRINTTOFILE
0x00080000
ファイルへ出力 チェックボックスを無効にします。
PD_ENABLEPRINTTEMPLATE
0x00004000
hInstance メンバーと lpPrintTemplateName メンバーが、全般 ページ下部の既定のダイアログボックステンプレートに代わるテンプレートを指定していることを示します。既定のテンプレートには、印刷 ダイアログボックスと同様のコントロールが含まれています。システムは、指定されたテンプレートを使用して 全般 ページの子となるウィンドウを作成します。
PD_ENABLEPRINTTEMPLATEHANDLE
0x00010000
hInstance メンバーが、あらかじめ読み込まれたダイアログボックステンプレートを含むデータブロックを識別することを示します。このテンプレートは、全般 ページ下部の既定のダイアログボックステンプレートを置き換えます。システムは、指定されたテンプレートを使用して 全般 ページの子となるウィンドウを作成します。このフラグを指定した場合、システムは lpPrintTemplateName メンバーを無視します。
PD_EXCLUSIONFLAGS
0x01000000
ExclusionFlags メンバーが、プリンタードライバーのプロパティページから除外する項目を識別することを示します。このフラグが設定されていない場合、項目は既定でプリンタードライバーのプロパティページから除外されます。この除外により、全般 ページ、アプリケーションが指定したページ、およびプリンタードライバーのページとの間で項目が重複することを防ぎます。
PD_HIDEPRINTTOFILE
0x00100000
ファイルへ出力 チェックボックスを非表示にします。
PD_NOCURRENTPAGE
0x00800000
現在のページ ラジオボタンを無効にします。
PD_NOPAGENUMS
0x00000008
ページ指定 ラジオボタンと、それに関連付けられた編集コントロールを無効にします。また、ダイアログに 部単位で印刷 チェックボックスが表示されるようになります。
PD_NOSELECTION
0x00000004
選択した部分 ラジオボタンを無効にします。
PD_NOWARNING
0x00000080
エラーが発生したときに警告メッセージを表示しないようにします。
PD_PAGENUMS
0x00000002
このフラグが設定されている場合、ページ指定 ラジオボタンが選択されます。PD_PAGENUMSPD_SELECTIONPD_CURRENTPAGE のいずれのフラグも設定されていない場合は、すべて ラジオボタンが選択されます。PrintDlgEx 関数から制御が戻った時点でこのフラグが設定されている場合、lpPageRanges メンバーはユーザーが指定したページ範囲を示します。
PD_PRINTTOFILE
0x00000020
このフラグが設定されている場合、ファイルへ出力 チェックボックスが選択されます。PrintDlgEx から制御が戻った時点でこのフラグが設定されている場合、DEVNAMES 構造体の wOutputOffset メンバーが示すオフセット位置には文字列 "FILE:" が格納されます。印刷処理を開始するために StartDoc 関数を呼び出すときは、この "FILE:" 文字列を DOCINFO 構造体の lpszOutput メンバーに指定します。この文字列を指定すると、印刷サブシステムは出力ファイルの名前をユーザーに問い合わせます。
PD_RETURNDC
0x00000100
PrintDlgEx が、ユーザーがプロパティシートで行った選択に対応するデバイスコンテキストを返すようにします。デバイスコンテキストは hDC に返されます。
PD_RETURNDEFAULT
0x00000400
このフラグが設定されている場合、PrintDlgEx 関数はプロパティシートを表示しません。代わりに、システムの既定のプリンター用に初期化された DEVNAMES 構造体と DEVMODE 構造体へのハンドルを、hDevNames メンバーと hDevMode メンバーに設定します。hDevNameshDevMode は両方とも NULL でなければなりません。そうでない場合、PrintDlgEx はエラーを返します。
PD_RETURNIC
0x00000200
PD_RETURNDC フラグと似ていますが、このフラグはデバイスコンテキストではなく情報コンテキストを返します。PD_RETURNDCPD_RETURNIC のどちらも指定しなかった場合、出力時の hDC は未定義です。
PD_SELECTION
0x00000001
このフラグが設定されている場合、選択した部分 ラジオボタンが選択されます。PD_PAGENUMSPD_SELECTIONPD_CURRENTPAGE のいずれのフラグも設定されていない場合は、すべて ラジオボタンが選択されます。
PD_USEDEVMODECOPIES
0x00040000
PD_USEDEVMODECOPIESANDCOLLATE と同じです。
PD_USEDEVMODECOPIESANDCOLLATE
0x00040000
このフラグは、アプリケーションが複数部の印刷と部単位印刷をサポートするかどうかを示します。アプリケーションが複数部の印刷と部単位印刷をサポートしない場合は、入力時にこのフラグを設定します。この場合、PRINTDLGEX 構造体の nCopies メンバーは常に 1 を返し、Flags メンバーに PD_COLLATE が設定されることはありません。

このフラグが設定されていない場合、複数部の印刷と部単位印刷はアプリケーションの責任となります。この場合、PRINTDLGEX 構造体の nCopies メンバーはユーザーが印刷を希望する部数を示し、Flags メンバーの PD_COLLATE フラグはユーザーが部単位印刷を希望しているかどうかを示します。

このフラグの設定の有無にかかわらず、アプリケーションは nCopiesPD_COLLATE から、何部レンダリングするか、および部単位で印刷するかどうかを判断できます。

このフラグが設定されていて、プリンタードライバーが複数部の印刷をサポートしていない場合、部数 編集コントロールは無効になります。同様に、このフラグが設定されていて、プリンタードライバーが部単位印刷をサポートしていない場合、部単位で印刷 チェックボックスは無効になります。

DEVMODE 構造体の dmCopies メンバーと dmCollate メンバーには、プリンタードライバーが使用する部数と部単位印刷の情報が格納されます。このフラグが設定されていて、プリンタードライバーが複数部の印刷をサポートしている場合、dmCopies メンバーはユーザーが要求した部数を示します。このフラグが設定されていて、プリンタードライバーが部単位印刷をサポートしている場合、DEVMODE 構造体の dmCollate メンバーはユーザーが部単位印刷を希望しているかどうかを示します。このフラグが設定されていない場合、dmCopies メンバーは常に 1 を返し、dmCollate メンバーは常に 0 になります。

Windows Vista より前の Windows では、呼び出し元のアプリケーションがこのフラグを設定しておらず、DEVMODE 構造体の dmCopies メンバーが 1 より大きい場合は、その値を部数として使用します。それ以外の場合は、PRINTDLGEX 構造体の nCopies メンバーの値を使用します。

PD_USELARGETEMPLATE
0x10000000
プロパティシートが 全般 ページに大きいテンプレートを使用するように強制します。大きいテンプレートは、全般 ページ下部にカスタムテンプレートを指定するアプリケーションに、より広いスペースを提供します。
Flags2DWORD4+40+24
ExclusionFlagsDWORD4+44+28

印刷 プロパティシート内のプリンタードライバーのプロパティページから項目を除外できるビットフラグのセット。この値は、Flags メンバーに PD_EXCLUSIONFLAGS フラグが設定されている場合にのみ使用されます。除外フラグは、除外する項目が 全般 ページ、または 印刷 プロパティシート内のアプリケーション定義のページに含まれる場合にのみ使用してください。このメンバーには次のフラグを指定できます。

PD_EXCL_COPIESANDCOLLATE

印刷 プロパティシート内のプリンタードライバーのプロパティページから、部数 コントロールと 部単位で印刷 コントロールを除外します。アプリケーションが 印刷 プロパティシートの 全般 ページ下部にある既定の 部数 コントロールと 部単位で印刷 コントロールを使用する場合は、常にこのフラグを設定してください。

nPageRangesDWORD4+48+32入力時には、lpPageRanges 配列に指定した初期のページ範囲の数をこのメンバーに設定します。PrintDlgEx 関数から制御が戻ると、nPageRangeslpPageRanges 配列に格納された、ユーザーが指定したページ範囲の数を示します。PD_NOPAGENUMS フラグを指定した場合、この値は有効ではありません。
nMaxPageRangesDWORD4+52+36lpPageRanges バッファーのサイズ (配列要素数)。この値は、配列に格納できるページ範囲の最大数を示します。PD_NOPAGENUMS フラグを指定した場合、この値は有効ではありません。PD_NOPAGENUMS フラグを指定しない場合、この値は 0 より大きくなければなりません。
lpPageRangesPRINTPAGERANGE*8/4+56+40PRINTPAGERANGE 構造体の配列を格納するバッファーへのポインター。入力時、この配列には ページ指定 編集コントロールに表示する初期のページ範囲を格納します。PrintDlgEx 関数から制御が戻ると、この配列にはユーザーが指定したページ範囲が格納されます。PD_NOPAGENUMS フラグを指定した場合、この値は有効ではありません。PD_NOPAGENUMS フラグを指定しない場合、lpPageRangesNULL 以外でなければなりません。
nMinPageDWORD4+64+44ページ指定 編集コントロールで指定するページ範囲の最小値。PD_NOPAGENUMS フラグを指定した場合、この値は有効ではありません。
nMaxPageDWORD4+68+48ページ指定 編集コントロールで指定するページ範囲の最大値。PD_NOPAGENUMS フラグを指定した場合、この値は有効ではありません。
nCopiesDWORD4+72+52hDevModeNULL の場合、部数 編集コントロールの初期部数が格納されます。それ以外の場合は、DEVMODE 構造体の dmCopies メンバーに初期値が格納されます。PrintDlgEx から制御が戻ると、nCopies にはアプリケーションが実際に印刷しなければならない部数が格納されます。この値は、複数部の印刷をアプリケーションとプリンタードライバーのどちらが担当するかによって異なります。Flags メンバーに PD_USEDEVMODECOPIESANDCOLLATE フラグが設定されている場合、戻り時の nCopies は常に 1 であり、複数部の印刷はプリンタードライバーが担当します。このフラグが設定されていない場合は、nCopies で指定された部数の印刷をアプリケーションが担当します。詳細については、PD_USEDEVMODECOPIESANDCOLLATE フラグの説明を参照してください。
hInstanceHINSTANCE8/4+76+56Flags メンバーに PD_ENABLEPRINTTEMPLATE フラグが設定されている場合、hInstancelpPrintTemplateName メンバーで指定されたダイアログボックステンプレートを含むアプリケーションまたはモジュールのインスタンスへのハンドルです。Flags メンバーに PD_ENABLEPRINTTEMPLATEHANDLE フラグが設定されている場合、hInstance はダイアログボックステンプレートを含むメモリオブジェクトへのハンドルです。Flags メンバーにどちらのテンプレートフラグも設定されていない場合、hInstanceNULL にしてください。
lpPrintTemplateNameLPWSTR8/4+84+60hInstance メンバーで識別されるモジュール内にあるダイアログボックステンプレートリソースの名前。このテンプレートは、全般 ページ下部の既定のダイアログボックステンプレートを置き換えます。既定のテンプレートには、印刷 ダイアログボックスと同様のコントロールが含まれています。このメンバーは、Flags メンバーに PD_ENABLEPRINTTEMPLATE フラグが設定されていない限り無視されます。
lpCallbackIUnknown*8/4+92+64

アプリケーション定義のコールバックオブジェクトへのポインター。

このオブジェクトは、全般 ページ下部の子ダイアログボックスのメッセージを受け取るために、IPrintDialogCallback クラスを含んでいる必要があります。

また、コールバックオブジェクトは、IPrintDialogServices インターフェイスへのポインターを受け取るために IObjectWithSite クラスも含んでいる必要があります。PrintDlgEx 関数は、どのインターフェイスがサポートされているかを判断するために、コールバックオブジェクトに対して IID_IPrintDialogCallbackIID_IObjectWithSite の両方で IUnknown::QueryInterface を呼び出します。

コールバック情報を取得する必要がない場合は、lpCallbackNULL を設定します。

nPropertyPagesDWORD4+100+68
                <b>lphPropertyPages</b> 配列に含まれるプロパティページハンドルの数。
lphPropertyPagesHPROPSHEETPAGE*8/4+104+72印刷 プロパティシートに追加するプロパティページハンドルの配列を格納します。追加のプロパティページは 全般 ページの後に続きます。これらの追加ページを作成するには、CreatePropertySheetPage 関数を使用します。PrintDlgEx 関数から制御が戻った時点で、lphPropertyPages 配列内のすべての HPROPSHEETPAGE ハンドルは破棄されています。nPropertyPages が 0 の場合、lphPropertyPagesNULL にしてください。
nStartPageDWORD4+112+76最初に表示されるプロパティページ。全般 ページを表示するには START_PAGE_GENERAL を指定します。それ以外の場合は、lphPropertyPages メンバーで指定した配列内のプロパティページの、0 から始まるインデックスを指定します。一貫性のため、プロパティシートは常に 全般 ページから開始することをお勧めします。
dwResultActionDWORD4+116+80

入力時には、このメンバーに 0 を設定します。PrintDlgEx 関数が S_OK を返した場合、dwResultAction にはダイアログの結果が格納されます。PrintDlgEx がエラーを返した場合、このメンバーは無視してください。dwResultAction メンバーは次のいずれかの値になります。

PD_RESULT_APPLY

ユーザーが 適用 ボタンをクリックし、その後 キャンセル ボタンをクリックしました。これは、ユーザーがプロパティシートで行った変更を適用したいが、まだ印刷は行いたくないことを示します。PRINTDLGEX 構造体には、適用 ボタンがクリックされた時点でユーザーが指定した情報が格納されます。

PD_RESULT_CANCEL

ユーザーが キャンセル ボタンをクリックしました。PRINTDLGEX 構造体の情報は変更されていません。

PD_RESULT_PRINT

ユーザーが 印刷 ボタンをクリックしました。PRINTDLGEX 構造体には、ユーザーが指定した情報が格納されます。

- ExclusionFlags.PD_EXCL_COPIESANDCOLLATE

印刷 プロパティシート内のプリンタードライバーのプロパティページから、部数 コントロールと 部単位で印刷 コントロールを除外します。アプリケーションが 印刷 プロパティシートの 全般 ページ下部にある既定の 部数 コントロールと 部単位で印刷 コントロールを使用する場合は、常にこのフラグを設定してください。

- dwResultAction.PD_RESULT_APPLY

ユーザーが 適用 ボタンをクリックし、その後 キャンセル ボタンをクリックしました。これは、ユーザーがプロパティシートで行った変更を適用したいが、まだ印刷は行いたくないことを示します。PRINTDLGEX 構造体には、適用 ボタンがクリックされた時点でユーザーが指定した情報が格納されます。

- dwResultAction.PD_RESULT_CANCEL

ユーザーが キャンセル ボタンをクリックしました。PRINTDLGEX 構造体の情報は変更されていません。

- dwResultAction.PD_RESULT_PRINT

ユーザーが 印刷 ボタンをクリックしました。PRINTDLGEX 構造体には、ユーザーが指定した情報が格納されます。

公式ドキュメント

PrintDlgEx 関数が 印刷プロパティシート を初期化するために使用する情報を格納します。ユーザーがプロパティシートを閉じた後、システムはこの構造体を使用してユーザーの選択内容に関する情報を返します。

解説(Remarks)

hDevModehDevNames の両方が NULL の場合、PrintDlgEx は現在の既定のプリンターを使用してプロパティシートを初期化します。別のプリンター用にプロパティシートを初期化するには、DEVNAMES 構造体の wDeviceOffset メンバーでプリンター名を指定します。

なお、DEVMODE 構造体の dmDeviceName メンバーでもプリンター名を指定できます。ただし、dmDeviceName は 32 文字までに制限されているのに対し、wDeviceOffset の名前には制限がありません。wDeviceOffsetdmDeviceName の名前が異なる場合、PrintDlgExwDeviceOffset で指定されたプリンターを使用してプロパティシートを初期化します。

PD_RETURNDEFAULT フラグが設定されていて、hDevModehDevNames の両方が NULL の場合、PrintDlgEx はダイアログボックスを表示せずに、hDevNames メンバーと hDevMode メンバーを使用して現在の既定のプリンターに関する情報を返します。

PrintDlgEx の実行中、PRINTDLGEX 構造体で指定した DEVMODE 構造体と DEVNAMES 構造体には、常に最新のデータが格納されているとは限りません。そのため、アプリケーション独自のプロパティページや、最初のページ用の IPrintDialogCallback ルーチンでは、現在のプリンターの状態に関する情報を取得するために IPrintDialogServices インターフェイスを使用してください。

メモ

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

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

各言語での定義

#include <windows.h>

// PRINTDLGEXW  (x64 120 / x86 84 バイト)
#pragma pack(push, 1)
typedef struct PRINTDLGEXW {
    DWORD lStructSize;
    HWND hwndOwner;
    HGLOBAL hDevMode;
    HGLOBAL hDevNames;
    HDC hDC;
    PRINTDLGEX_FLAGS Flags;
    DWORD Flags2;
    DWORD ExclusionFlags;
    DWORD nPageRanges;
    DWORD nMaxPageRanges;
    PRINTPAGERANGE* lpPageRanges;
    DWORD nMinPage;
    DWORD nMaxPage;
    DWORD nCopies;
    HINSTANCE hInstance;
    LPWSTR lpPrintTemplateName;
    IUnknown* lpCallback;
    DWORD nPropertyPages;
    HPROPSHEETPAGE* lphPropertyPages;
    DWORD nStartPage;
    DWORD dwResultAction;
} PRINTDLGEXW;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct PRINTDLGEXW
{
    public uint lStructSize;
    public IntPtr hwndOwner;
    public IntPtr hDevMode;
    public IntPtr hDevNames;
    public IntPtr hDC;
    public uint Flags;
    public uint Flags2;
    public uint ExclusionFlags;
    public uint nPageRanges;
    public uint nMaxPageRanges;
    public IntPtr lpPageRanges;
    public uint nMinPage;
    public uint nMaxPage;
    public uint nCopies;
    public IntPtr hInstance;
    public IntPtr lpPrintTemplateName;
    public IntPtr lpCallback;
    public uint nPropertyPages;
    public IntPtr lphPropertyPages;
    public uint nStartPage;
    public uint dwResultAction;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure PRINTDLGEXW
    Public lStructSize As UInteger
    Public hwndOwner As IntPtr
    Public hDevMode As IntPtr
    Public hDevNames As IntPtr
    Public hDC As IntPtr
    Public Flags As UInteger
    Public Flags2 As UInteger
    Public ExclusionFlags As UInteger
    Public nPageRanges As UInteger
    Public nMaxPageRanges As UInteger
    Public lpPageRanges As IntPtr
    Public nMinPage As UInteger
    Public nMaxPage As UInteger
    Public nCopies As UInteger
    Public hInstance As IntPtr
    Public lpPrintTemplateName As IntPtr
    Public lpCallback As IntPtr
    Public nPropertyPages As UInteger
    Public lphPropertyPages As IntPtr
    Public nStartPage As UInteger
    Public dwResultAction As UInteger
End Structure
import ctypes
from ctypes import wintypes

class PRINTDLGEXW(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("lStructSize", wintypes.DWORD),
        ("hwndOwner", ctypes.c_void_p),
        ("hDevMode", ctypes.c_void_p),
        ("hDevNames", ctypes.c_void_p),
        ("hDC", ctypes.c_void_p),
        ("Flags", wintypes.DWORD),
        ("Flags2", wintypes.DWORD),
        ("ExclusionFlags", wintypes.DWORD),
        ("nPageRanges", wintypes.DWORD),
        ("nMaxPageRanges", wintypes.DWORD),
        ("lpPageRanges", ctypes.c_void_p),
        ("nMinPage", wintypes.DWORD),
        ("nMaxPage", wintypes.DWORD),
        ("nCopies", wintypes.DWORD),
        ("hInstance", ctypes.c_void_p),
        ("lpPrintTemplateName", ctypes.c_void_p),
        ("lpCallback", ctypes.c_void_p),
        ("nPropertyPages", wintypes.DWORD),
        ("lphPropertyPages", ctypes.c_void_p),
        ("nStartPage", wintypes.DWORD),
        ("dwResultAction", wintypes.DWORD),
    ]
#[repr(C, packed(1))]
pub struct PRINTDLGEXW {
    pub lStructSize: u32,
    pub hwndOwner: *mut core::ffi::c_void,
    pub hDevMode: *mut core::ffi::c_void,
    pub hDevNames: *mut core::ffi::c_void,
    pub hDC: *mut core::ffi::c_void,
    pub Flags: u32,
    pub Flags2: u32,
    pub ExclusionFlags: u32,
    pub nPageRanges: u32,
    pub nMaxPageRanges: u32,
    pub lpPageRanges: *mut core::ffi::c_void,
    pub nMinPage: u32,
    pub nMaxPage: u32,
    pub nCopies: u32,
    pub hInstance: *mut core::ffi::c_void,
    pub lpPrintTemplateName: *mut core::ffi::c_void,
    pub lpCallback: *mut core::ffi::c_void,
    pub nPropertyPages: u32,
    pub lphPropertyPages: *mut core::ffi::c_void,
    pub nStartPage: u32,
    pub dwResultAction: u32,
}
import "golang.org/x/sys/windows"

type PRINTDLGEXW struct {
	lStructSize uint32
	hwndOwner uintptr
	hDevMode uintptr
	hDevNames uintptr
	hDC uintptr
	Flags uint32
	Flags2 uint32
	ExclusionFlags uint32
	nPageRanges uint32
	nMaxPageRanges uint32
	lpPageRanges uintptr
	nMinPage uint32
	nMaxPage uint32
	nCopies uint32
	hInstance uintptr
	lpPrintTemplateName uintptr
	lpCallback uintptr
	nPropertyPages uint32
	lphPropertyPages uintptr
	nStartPage uint32
	dwResultAction uint32
}
type
  PRINTDLGEXW = packed record
    lStructSize: DWORD;
    hwndOwner: Pointer;
    hDevMode: Pointer;
    hDevNames: Pointer;
    hDC: Pointer;
    Flags: DWORD;
    Flags2: DWORD;
    ExclusionFlags: DWORD;
    nPageRanges: DWORD;
    nMaxPageRanges: DWORD;
    lpPageRanges: Pointer;
    nMinPage: DWORD;
    nMaxPage: DWORD;
    nCopies: DWORD;
    hInstance: Pointer;
    lpPrintTemplateName: Pointer;
    lpCallback: Pointer;
    nPropertyPages: DWORD;
    lphPropertyPages: Pointer;
    nStartPage: DWORD;
    dwResultAction: DWORD;
  end;
const PRINTDLGEXW = extern struct {
    lStructSize: u32,
    hwndOwner: ?*anyopaque,
    hDevMode: ?*anyopaque,
    hDevNames: ?*anyopaque,
    hDC: ?*anyopaque,
    Flags: u32,
    Flags2: u32,
    ExclusionFlags: u32,
    nPageRanges: u32,
    nMaxPageRanges: u32,
    lpPageRanges: ?*anyopaque,
    nMinPage: u32,
    nMaxPage: u32,
    nCopies: u32,
    hInstance: ?*anyopaque,
    lpPrintTemplateName: ?*anyopaque,
    lpCallback: ?*anyopaque,
    nPropertyPages: u32,
    lphPropertyPages: ?*anyopaque,
    nStartPage: u32,
    dwResultAction: u32,
};
type
  PRINTDLGEXW {.packed.} = object
    lStructSize: uint32
    hwndOwner: pointer
    hDevMode: pointer
    hDevNames: pointer
    hDC: pointer
    Flags: uint32
    Flags2: uint32
    ExclusionFlags: uint32
    nPageRanges: uint32
    nMaxPageRanges: uint32
    lpPageRanges: pointer
    nMinPage: uint32
    nMaxPage: uint32
    nCopies: uint32
    hInstance: pointer
    lpPrintTemplateName: pointer
    lpCallback: pointer
    nPropertyPages: uint32
    lphPropertyPages: pointer
    nStartPage: uint32
    dwResultAction: uint32
align(1)
struct PRINTDLGEXW
{
    uint lStructSize;
    void* hwndOwner;
    void* hDevMode;
    void* hDevNames;
    void* hDC;
    uint Flags;
    uint Flags2;
    uint ExclusionFlags;
    uint nPageRanges;
    uint nMaxPageRanges;
    void* lpPageRanges;
    uint nMinPage;
    uint nMaxPage;
    uint nCopies;
    void* hInstance;
    void* lpPrintTemplateName;
    void* lpCallback;
    uint nPropertyPages;
    void* lphPropertyPages;
    uint nStartPage;
    uint dwResultAction;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; PRINTDLGEXW サイズ: 84 バイト(x86)
dim st, 21    ; 4byte整数×21(構造体サイズ 84 / 4 切り上げ)
; lStructSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; hwndOwner : HWND (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; hDevMode : HGLOBAL (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; hDevNames : HGLOBAL (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; hDC : HDC (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; Flags : PRINTDLGEX_FLAGS (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; Flags2 : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ExclusionFlags : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; nPageRanges : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; nMaxPageRanges : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; lpPageRanges : PRINTPAGERANGE* (+40, 4byte)  varptr(st)+40 を基点に操作(4byte:入れ子/配列)
; nMinPage : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; nMaxPage : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; nCopies : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; hInstance : HINSTANCE (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; lpPrintTemplateName : LPWSTR (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; lpCallback : IUnknown* (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; nPropertyPages : DWORD (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; lphPropertyPages : HPROPSHEETPAGE* (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; nStartPage : DWORD (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; dwResultAction : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; PRINTDLGEXW サイズ: 120 バイト(x64)
dim st, 30    ; 4byte整数×30(構造体サイズ 120 / 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,上位
; hDevMode : HGLOBAL (+12, 8byte)  qpoke st,12,値 / qpeek(st,12)  ※IronHSPのみ。3.7/3.8は lpoke st,12,下位 : lpoke st,16,上位
; hDevNames : HGLOBAL (+20, 8byte)  qpoke st,20,値 / qpeek(st,20)  ※IronHSPのみ。3.7/3.8は lpoke st,20,下位 : lpoke st,24,上位
; hDC : HDC (+28, 8byte)  qpoke st,28,値 / qpeek(st,28)  ※IronHSPのみ。3.7/3.8は lpoke st,28,下位 : lpoke st,32,上位
; Flags : PRINTDLGEX_FLAGS (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; Flags2 : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; ExclusionFlags : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; nPageRanges : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; nMaxPageRanges : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; lpPageRanges : PRINTPAGERANGE* (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; nMinPage : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; nMaxPage : DWORD (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; nCopies : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; hInstance : HINSTANCE (+76, 8byte)  qpoke st,76,値 / qpeek(st,76)  ※IronHSPのみ。3.7/3.8は lpoke st,76,下位 : lpoke st,80,上位
; lpPrintTemplateName : LPWSTR (+84, 8byte)  qpoke st,84,値 / qpeek(st,84)  ※IronHSPのみ。3.7/3.8は lpoke st,84,下位 : lpoke st,88,上位
; lpCallback : IUnknown* (+92, 8byte)  qpoke st,92,値 / qpeek(st,92)  ※IronHSPのみ。3.7/3.8は lpoke st,92,下位 : lpoke st,96,上位
; nPropertyPages : DWORD (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; lphPropertyPages : HPROPSHEETPAGE* (+104, 8byte)  qpoke st,104,値 / qpeek(st,104)  ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; nStartPage : DWORD (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; dwResultAction : DWORD (+116, 4byte)  st.29 = 値  /  値 = st.29   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global PRINTDLGEXW, pack=1
    #field int lStructSize
    #field intptr hwndOwner
    #field intptr hDevMode
    #field intptr hDevNames
    #field intptr hDC
    #field int Flags
    #field int Flags2
    #field int ExclusionFlags
    #field int nPageRanges
    #field int nMaxPageRanges
    #field intptr lpPageRanges
    #field int nMinPage
    #field int nMaxPage
    #field int nCopies
    #field intptr hInstance
    #field intptr lpPrintTemplateName
    #field intptr lpCallback
    #field int nPropertyPages
    #field intptr lphPropertyPages
    #field int nStartPage
    #field int dwResultAction
#endstruct

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