DEVMODEW
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| dmDeviceName | WCHAR | 64 | +0 | +0 | ディスプレイの場合は、ディスプレイドライバーの DLL の名前を指定します。たとえば、3Dlabs Permedia3 ディスプレイドライバーの場合は "perm3dd" です。 プリンターの場合は「フレンドリ名」を指定します。たとえば PCL/HP LaserJet の場合は "PCL/HP LaserJet" です。名前の長さが CCHDEVICENAME 文字を超える場合、スプーラーは配列に収まるように切り詰めます。 |
| dmSpecVersion | WORD | 2 | +64 | +64 | この DEVMODEW 構造体のバージョン番号を指定します。現在のバージョン番号は wingdi.h の DM_SPECVERSION 定数で識別されます。 |
| dmDriverVersion | WORD | 2 | +66 | +66 | プリンターの場合、プリンタードライバーの開発者が割り当てたプリンタードライバーのバージョン番号を指定します。 ディスプレイドライバーは、このメンバーに DM_SPECVERSION を設定できます。 |
| dmSize | WORD | 2 | +68 | +68 | public な DEVMODEW 構造体のサイズをバイト単位で指定します。dmDriverExtra メンバーで示される、ドライバー固有のプライベートメンバーは含みません。 |
| dmDriverExtra | WORD | 2 | +70 | +70 | public な構造体メンバーの後ろに続く、プライベートなドライバーデータのバイト数を指定します。デバイスドライバーがプライベートな DEVMODEW メンバーを提供しない場合、このメンバーは 0 に設定してください。 |
| dmFields | DEVMODE_FIELD_FLAGS | 4 | +72 | +72 | 以下の DEVMODEW メンバーのうち、どれが使用されているかを示すビットフラグを指定します。たとえば、dmOrientation メンバーが有効なデータを含む場合には DM_ORIENTATION フラグが設定されます。DM_XXX フラグは wingdi.h で定義されています。 |
| Anonymous1 | _Anonymous1_e__Union | 8/4 | +80 | +76 | 印刷の向きや位置などを保持する無名共用体。 |
| dmColor | DEVMODE_COLOR | 2 | +88 | +80 | プリンターの場合、カラープリンターがカラーで印刷するかモノクロで印刷するかを指定します。このメンバーには DMCOLOR_COLOR または DMCOLOR_MONOCHROME のいずれかを指定できます。 このメンバーはディスプレイでは使用されません。 |
| dmDuplex | DEVMODE_DUPLEX | 2 | +90 | +82 | プリンターの場合、両面印刷に対応したプリンターでの両面印刷を指定します。このメンバーには次のいずれかの値を指定できます。 DMDUP_HORIZONTAL短辺とじで両面印刷します。 DMDUP_SIMPLEX片面印刷します。 DMDUP_VERTICAL長辺とじで両面印刷します。 このメンバーはディスプレイでは使用されません。 |
| dmYResolution | SHORT | 2 | +92 | +84 | プリンターの場合、プリンターの y 方向の解像度を DPI 単位で指定します。このメンバーを使用する場合、dmPrintQuality メンバーが x 方向の解像度を指定します。 このメンバーはディスプレイでは使用されません。 |
| dmTTOption | DEVMODE_TRUETYPE_OPTION | 2 | +94 | +86 | プリンターの場合、TrueType フォントをどのように印刷するかを指定します。このメンバーは wingdi.h で定義されている DMTT で始まる定数のいずれかでなければなりません。 このメンバーはディスプレイでは使用されません。 |
| dmCollate | DEVMODE_COLLATE | 2 | +96 | +88 | プリンターの場合、複数部を印刷するときに部単位で印刷するかどうかを指定します。このメンバーには次のいずれかの値を指定できます。 DMCOLLATE_TRUE複数部を印刷するときに部単位でそろえます。 DMCOLLATE_FALSE複数部を印刷するときに部単位でそろえません。 このメンバーはディスプレイでは使用されません。 |
| dmFormName | WCHAR | 64 | +98 | +90 | プリンターの場合、使用するフォームの名前 ("Letter" や "Legal" など) を指定します。これは Win32 の EnumForms 関数を呼び出して取得できる名前でなければなりません。 このメンバーはディスプレイでは使用されません。 |
| dmLogPixels | WORD | 2 | +162 | +154 | ディスプレイの場合、ディスプレイデバイスの 1 インチあたりの論理ピクセル数を指定します。この値は GDIINFO 構造体の ulLogPixels メンバーと等しくなければなりません。 このメンバーはプリンターでは使用されません。 |
| dmBitsPerPel | DWORD | 4 | +164 | +156 | ディスプレイの場合、ディスプレイデバイスの色の解像度を 1 ピクセルあたりのビット数で指定します。 このメンバーはプリンターでは使用されません。 |
| dmPelsWidth | DWORD | 4 | +168 | +160 | ディスプレイの場合、表示可能なデバイスサーフェスの幅をピクセル単位で指定します。 このメンバーはプリンターでは使用されません。 |
| dmPelsHeight | DWORD | 4 | +172 | +164 | ディスプレイの場合、表示可能なデバイスサーフェスの高さをピクセル単位で指定します。 このメンバーはプリンターでは使用されません。 |
| Anonymous2 | _Anonymous2_e__Union | 4 | +176 | +168 | 表示フラグやニブル数を保持する無名共用体。 |
| dmDisplayFrequency | DWORD | 4 | +180 | +172 | ディスプレイの場合、現在のモードにおけるディスプレイデバイスの周波数をヘルツ単位で指定します。 このメンバーはプリンターでは使用されません。 |
| dmICMMethod | DWORD | 4 | +184 | +176 | wingdi.h で定義されている DMICMMETHOD で始まる定数のいずれかを指定します。 |
| dmICMIntent | DWORD | 4 | +188 | +180 | wingdi.h で定義されている DMICM で始まる定数のいずれかを指定します。 |
| dmMediaType | DWORD | 4 | +192 | +184 | wingdi.h で定義されている DMMEDIA で始まる定数のいずれかを指定します。 |
| dmDitherType | DWORD | 4 | +196 | +188 | wingdi.h で定義されている DMDITHER で始まる定数のいずれかを指定します。 |
| dmReserved1 | DWORD | 4 | +200 | +192 | システムでの使用のために予約済みです。ドライバーは無視してください。 |
| dmReserved2 | DWORD | 4 | +204 | +196 | システムでの使用のために予約済みです。ドライバーは無視してください。 |
| dmPanningWidth | DWORD | 4 | +208 | +200 | システムでの使用のために予約済みです。ドライバーは無視してください。 |
| dmPanningHeight | DWORD | 4 | +212 | +204 | システムでの使用のために予約済みです。ドライバーは無視してください。 - dmDisplayFlags.DM_GRAYSCALEディスプレイがカラーデバイスではないことを指定します。このフラグが設定されていない場合はカラーとみなされます。 - dmDisplayFlags.DM_INTERLACED表示モードがインターレースであることを指定します。このフラグが設定されていない場合はノンインターレースとみなされます。 |
共用体: _Anonymous1_e__Union x64 8B / x86 4B
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Anonymous1 | _Anonymous1_e__Struct | 8/4 | +0 | +0 | 印刷の向きや位置などを保持する無名共用体。 |
| Anonymous2 | _Anonymous2_e__Struct | 8/4 | +0 | +0 | 表示フラグやニブル数を保持する無名共用体。 |
共用体: _Anonymous2_e__Union x64 4B / x86 4B
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| dmDisplayFlags | DWORD | 4 | +0 | +0 | デバイスの表示モードを指定します。このメンバーには次の値の組み合わせを指定できます。
このメンバーはディスプレイドライバーが使用します。たとえば ChangeDisplaySettings 関数で使用されます。プリンタードライバーはこのメンバーを使用しません。 | ||||||
| dmNup | DWORD | 4 | +0 | +0 | プリンターの場合、印刷システムが「N-up」印刷 (複数の EMF 論理ページを 1 枚の物理ページに再生すること) を処理するかどうかを指定します。このメンバーの値は次のいずれかです。
このメンバーはディスプレイでは使用されません。 |
公式ドキュメント
DEVMODEW 構造体は、Unicode (ワイド) 文字セットでディスプレイデバイスおよび印刷デバイスの特性を指定するために使用されます。
解説(Remarks)
DEVMODEW 構造体は、DEVMODE 構造体 (Microsoft Windows SDK のドキュメントで説明されています) の Unicode 版です。アプリケーションは ANSI 版と Unicode 版のどちらの構造体も使用できますが、ドライバーは Unicode 版を使用する必要があります。
プリンタードライバーでは、DEVMODEW 構造体は印刷ドキュメントが必要とするプリンターの特性を指定するために使用されます。また、プリンターの既定の特性を指定するためにも使用されます。
DEVMODEW 構造体の定義済みメンバー (public メンバーと呼ばれることが多い) の直後には、ドライバーが定義するメンバー (プライベート DEVMODEW メンバーと呼ばれることが多い) の集合を置くことができます。ドライバーは、このプライベート領域のサイズをバイト単位で dmDriverExtra に設定します。ドライバーが定義するプライベートメンバーは、そのドライバー専用のものです。プライベートメンバーの開始アドレスは、次のように dmSize メンバーを使って参照できます。
PVOID pvDriverData = (PVOID) (((BYTE *) pdm) + (pdm->dmSize));
ドライバーは、スプーラーが (dmSize + dmDriverExtra) バイト以上の DEVMODEW バッファーを渡すことを前提にできます。そのため、ドライバーはバッファーの先頭からそのバイト数を、アクセス違反を発生させることなく、またメモリをプローブする必要もなく安全に読み取ることができます。
EMF を再生する前に、GDI はスプーラーを呼び出して DEVMODEW バッファーの public 部分の内容を検証します。DEVMODEW バッファーがスプーラーで実行される検証テストに合格しない場合、GDI はそのバッファーをプリンタードライバーに渡しません。
Windows XP では、新しい struct メンバーが追加されました。この struct メンバーには、既存の DEVMODEW 構造体メンバーである dmPosition と、新しい 2 つのメンバーである dmDisplayOrientation および dmDisplayFixedOutput が含まれます。これらのメンバーについては前述のメンバーのセクションで説明しています。
さらに Windows XP では、DEVMODEW 構造体のいくつかのメンバーが構造体内の別の位置に移動されました。dmScale、dmCopies、dmDefaultSource、dmPrintQuality の各メンバーは、dmOrientation、dmPaperSize、dmPaperLength、dmPaperWidth の各メンバーを含む struct メンバーの末尾に追加されました。
wingdi.h ヘッダーは、UNICODE プリプロセッサ定数の定義に応じて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして DEVMODE を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じてコンパイルエラーや実行時エラーの原因となることがあります。詳細については、Conventions for Function Prototypes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// DEVMODEW (x64 216 / x86 208 バイト)
typedef struct DEVMODEW {
WCHAR dmDeviceName[32];
WORD dmSpecVersion;
WORD dmDriverVersion;
WORD dmSize;
WORD dmDriverExtra;
DEVMODE_FIELD_FLAGS dmFields;
_Anonymous1_e__Union Anonymous1;
DEVMODE_COLOR dmColor;
DEVMODE_DUPLEX dmDuplex;
SHORT dmYResolution;
DEVMODE_TRUETYPE_OPTION dmTTOption;
DEVMODE_COLLATE dmCollate;
WCHAR dmFormName[32];
WORD dmLogPixels;
DWORD dmBitsPerPel;
DWORD dmPelsWidth;
DWORD dmPelsHeight;
_Anonymous2_e__Union Anonymous2;
DWORD dmDisplayFrequency;
DWORD dmICMMethod;
DWORD dmICMIntent;
DWORD dmMediaType;
DWORD dmDitherType;
DWORD dmReserved1;
DWORD dmReserved2;
DWORD dmPanningWidth;
DWORD dmPanningHeight;
} DEVMODEW;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DEVMODEW
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmDeviceName;
public ushort dmSpecVersion;
public ushort dmDriverVersion;
public ushort dmSize;
public ushort dmDriverExtra;
public uint dmFields;
public _Anonymous1_e__Union Anonymous1;
public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmFormName;
public ushort dmLogPixels;
public uint dmBitsPerPel;
public uint dmPelsWidth;
public uint dmPelsHeight;
public _Anonymous2_e__Union Anonymous2;
public uint dmDisplayFrequency;
public uint dmICMMethod;
public uint dmICMIntent;
public uint dmMediaType;
public uint dmDitherType;
public uint dmReserved1;
public uint dmReserved2;
public uint dmPanningWidth;
public uint dmPanningHeight;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DEVMODEW
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> Public dmDeviceName As String
Public dmSpecVersion As UShort
Public dmDriverVersion As UShort
Public dmSize As UShort
Public dmDriverExtra As UShort
Public dmFields As UInteger
Public Anonymous1 As _Anonymous1_e__Union
Public dmColor As Short
Public dmDuplex As Short
Public dmYResolution As Short
Public dmTTOption As Short
Public dmCollate As Short
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> Public dmFormName As String
Public dmLogPixels As UShort
Public dmBitsPerPel As UInteger
Public dmPelsWidth As UInteger
Public dmPelsHeight As UInteger
Public Anonymous2 As _Anonymous2_e__Union
Public dmDisplayFrequency As UInteger
Public dmICMMethod As UInteger
Public dmICMIntent As UInteger
Public dmMediaType As UInteger
Public dmDitherType As UInteger
Public dmReserved1 As UInteger
Public dmReserved2 As UInteger
Public dmPanningWidth As UInteger
Public dmPanningHeight As UInteger
End Structureimport ctypes
from ctypes import wintypes
class DEVMODEW(ctypes.Structure):
_fields_ = [
("dmDeviceName", ctypes.c_wchar * 32),
("dmSpecVersion", ctypes.c_ushort),
("dmDriverVersion", ctypes.c_ushort),
("dmSize", ctypes.c_ushort),
("dmDriverExtra", ctypes.c_ushort),
("dmFields", wintypes.DWORD),
("Anonymous1", _Anonymous1_e__Union),
("dmColor", ctypes.c_short),
("dmDuplex", ctypes.c_short),
("dmYResolution", ctypes.c_short),
("dmTTOption", ctypes.c_short),
("dmCollate", ctypes.c_short),
("dmFormName", ctypes.c_wchar * 32),
("dmLogPixels", ctypes.c_ushort),
("dmBitsPerPel", wintypes.DWORD),
("dmPelsWidth", wintypes.DWORD),
("dmPelsHeight", wintypes.DWORD),
("Anonymous2", _Anonymous2_e__Union),
("dmDisplayFrequency", wintypes.DWORD),
("dmICMMethod", wintypes.DWORD),
("dmICMIntent", wintypes.DWORD),
("dmMediaType", wintypes.DWORD),
("dmDitherType", wintypes.DWORD),
("dmReserved1", wintypes.DWORD),
("dmReserved2", wintypes.DWORD),
("dmPanningWidth", wintypes.DWORD),
("dmPanningHeight", wintypes.DWORD),
]#[repr(C)]
pub struct DEVMODEW {
pub dmDeviceName: [u16; 32],
pub dmSpecVersion: u16,
pub dmDriverVersion: u16,
pub dmSize: u16,
pub dmDriverExtra: u16,
pub dmFields: u32,
pub Anonymous1: _Anonymous1_e__Union,
pub dmColor: i16,
pub dmDuplex: i16,
pub dmYResolution: i16,
pub dmTTOption: i16,
pub dmCollate: i16,
pub dmFormName: [u16; 32],
pub dmLogPixels: u16,
pub dmBitsPerPel: u32,
pub dmPelsWidth: u32,
pub dmPelsHeight: u32,
pub Anonymous2: _Anonymous2_e__Union,
pub dmDisplayFrequency: u32,
pub dmICMMethod: u32,
pub dmICMIntent: u32,
pub dmMediaType: u32,
pub dmDitherType: u32,
pub dmReserved1: u32,
pub dmReserved2: u32,
pub dmPanningWidth: u32,
pub dmPanningHeight: u32,
}import "golang.org/x/sys/windows"
type DEVMODEW struct {
dmDeviceName [32]uint16
dmSpecVersion uint16
dmDriverVersion uint16
dmSize uint16
dmDriverExtra uint16
dmFields uint32
Anonymous1 _Anonymous1_e__Union
dmColor int16
dmDuplex int16
dmYResolution int16
dmTTOption int16
dmCollate int16
dmFormName [32]uint16
dmLogPixels uint16
dmBitsPerPel uint32
dmPelsWidth uint32
dmPelsHeight uint32
Anonymous2 _Anonymous2_e__Union
dmDisplayFrequency uint32
dmICMMethod uint32
dmICMIntent uint32
dmMediaType uint32
dmDitherType uint32
dmReserved1 uint32
dmReserved2 uint32
dmPanningWidth uint32
dmPanningHeight uint32
}type
DEVMODEW = record
dmDeviceName: array[0..31] of WideChar;
dmSpecVersion: Word;
dmDriverVersion: Word;
dmSize: Word;
dmDriverExtra: Word;
dmFields: DWORD;
Anonymous1: _Anonymous1_e__Union;
dmColor: Smallint;
dmDuplex: Smallint;
dmYResolution: Smallint;
dmTTOption: Smallint;
dmCollate: Smallint;
dmFormName: array[0..31] of WideChar;
dmLogPixels: Word;
dmBitsPerPel: DWORD;
dmPelsWidth: DWORD;
dmPelsHeight: DWORD;
Anonymous2: _Anonymous2_e__Union;
dmDisplayFrequency: DWORD;
dmICMMethod: DWORD;
dmICMIntent: DWORD;
dmMediaType: DWORD;
dmDitherType: DWORD;
dmReserved1: DWORD;
dmReserved2: DWORD;
dmPanningWidth: DWORD;
dmPanningHeight: DWORD;
end;const DEVMODEW = extern struct {
dmDeviceName: [32]u16,
dmSpecVersion: u16,
dmDriverVersion: u16,
dmSize: u16,
dmDriverExtra: u16,
dmFields: u32,
Anonymous1: _Anonymous1_e__Union,
dmColor: i16,
dmDuplex: i16,
dmYResolution: i16,
dmTTOption: i16,
dmCollate: i16,
dmFormName: [32]u16,
dmLogPixels: u16,
dmBitsPerPel: u32,
dmPelsWidth: u32,
dmPelsHeight: u32,
Anonymous2: _Anonymous2_e__Union,
dmDisplayFrequency: u32,
dmICMMethod: u32,
dmICMIntent: u32,
dmMediaType: u32,
dmDitherType: u32,
dmReserved1: u32,
dmReserved2: u32,
dmPanningWidth: u32,
dmPanningHeight: u32,
};type
DEVMODEW {.bycopy.} = object
dmDeviceName: array[32, uint16]
dmSpecVersion: uint16
dmDriverVersion: uint16
dmSize: uint16
dmDriverExtra: uint16
dmFields: uint32
Anonymous1: _Anonymous1_e__Union
dmColor: int16
dmDuplex: int16
dmYResolution: int16
dmTTOption: int16
dmCollate: int16
dmFormName: array[32, uint16]
dmLogPixels: uint16
dmBitsPerPel: uint32
dmPelsWidth: uint32
dmPelsHeight: uint32
Anonymous2: _Anonymous2_e__Union
dmDisplayFrequency: uint32
dmICMMethod: uint32
dmICMIntent: uint32
dmMediaType: uint32
dmDitherType: uint32
dmReserved1: uint32
dmReserved2: uint32
dmPanningWidth: uint32
dmPanningHeight: uint32struct DEVMODEW
{
wchar[32] dmDeviceName;
ushort dmSpecVersion;
ushort dmDriverVersion;
ushort dmSize;
ushort dmDriverExtra;
uint dmFields;
_Anonymous1_e__Union Anonymous1;
short dmColor;
short dmDuplex;
short dmYResolution;
short dmTTOption;
short dmCollate;
wchar[32] dmFormName;
ushort dmLogPixels;
uint dmBitsPerPel;
uint dmPelsWidth;
uint dmPelsHeight;
_Anonymous2_e__Union Anonymous2;
uint dmDisplayFrequency;
uint dmICMMethod;
uint dmICMIntent;
uint dmMediaType;
uint dmDitherType;
uint dmReserved1;
uint dmReserved2;
uint dmPanningWidth;
uint dmPanningHeight;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DEVMODEW サイズ: 208 バイト(x86)
dim st, 52 ; 4byte整数×52(構造体サイズ 208 / 4 切り上げ)
; dmDeviceName : WCHAR (+0, 64byte) varptr(st)+0 を基点に操作(64byte:入れ子/配列)
; dmSpecVersion : WORD (+64, 2byte) wpoke st,64,値 / 値 = wpeek(st,64)
; dmDriverVersion : WORD (+66, 2byte) wpoke st,66,値 / 値 = wpeek(st,66)
; dmSize : WORD (+68, 2byte) wpoke st,68,値 / 値 = wpeek(st,68)
; dmDriverExtra : WORD (+70, 2byte) wpoke st,70,値 / 値 = wpeek(st,70)
; dmFields : DEVMODE_FIELD_FLAGS (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; Anonymous1 : _Anonymous1_e__Union (+76, 4byte) varptr(st)+76 を基点に操作(4byte:入れ子/配列)
; dmColor : DEVMODE_COLOR (+80, 2byte) wpoke st,80,値 / 値 = wpeek(st,80)
; dmDuplex : DEVMODE_DUPLEX (+82, 2byte) wpoke st,82,値 / 値 = wpeek(st,82)
; dmYResolution : SHORT (+84, 2byte) wpoke st,84,値 / 値 = wpeek(st,84)
; dmTTOption : DEVMODE_TRUETYPE_OPTION (+86, 2byte) wpoke st,86,値 / 値 = wpeek(st,86)
; dmCollate : DEVMODE_COLLATE (+88, 2byte) wpoke st,88,値 / 値 = wpeek(st,88)
; dmFormName : WCHAR (+90, 64byte) varptr(st)+90 を基点に操作(64byte:入れ子/配列)
; dmLogPixels : WORD (+154, 2byte) wpoke st,154,値 / 値 = wpeek(st,154)
; dmBitsPerPel : DWORD (+156, 4byte) st.39 = 値 / 値 = st.39 (lpoke/lpeek も可)
; dmPelsWidth : DWORD (+160, 4byte) st.40 = 値 / 値 = st.40 (lpoke/lpeek も可)
; dmPelsHeight : DWORD (+164, 4byte) st.41 = 値 / 値 = st.41 (lpoke/lpeek も可)
; Anonymous2 : _Anonymous2_e__Union (+168, 4byte) varptr(st)+168 を基点に操作(4byte:入れ子/配列)
; dmDisplayFrequency : DWORD (+172, 4byte) st.43 = 値 / 値 = st.43 (lpoke/lpeek も可)
; dmICMMethod : DWORD (+176, 4byte) st.44 = 値 / 値 = st.44 (lpoke/lpeek も可)
; dmICMIntent : DWORD (+180, 4byte) st.45 = 値 / 値 = st.45 (lpoke/lpeek も可)
; dmMediaType : DWORD (+184, 4byte) st.46 = 値 / 値 = st.46 (lpoke/lpeek も可)
; dmDitherType : DWORD (+188, 4byte) st.47 = 値 / 値 = st.47 (lpoke/lpeek も可)
; dmReserved1 : DWORD (+192, 4byte) st.48 = 値 / 値 = st.48 (lpoke/lpeek も可)
; dmReserved2 : DWORD (+196, 4byte) st.49 = 値 / 値 = st.49 (lpoke/lpeek も可)
; dmPanningWidth : DWORD (+200, 4byte) st.50 = 値 / 値 = st.50 (lpoke/lpeek も可)
; dmPanningHeight : DWORD (+204, 4byte) st.51 = 値 / 値 = st.51 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DEVMODEW サイズ: 216 バイト(x64)
dim st, 54 ; 4byte整数×54(構造体サイズ 216 / 4 切り上げ)
; dmDeviceName : WCHAR (+0, 64byte) varptr(st)+0 を基点に操作(64byte:入れ子/配列)
; dmSpecVersion : WORD (+64, 2byte) wpoke st,64,値 / 値 = wpeek(st,64)
; dmDriverVersion : WORD (+66, 2byte) wpoke st,66,値 / 値 = wpeek(st,66)
; dmSize : WORD (+68, 2byte) wpoke st,68,値 / 値 = wpeek(st,68)
; dmDriverExtra : WORD (+70, 2byte) wpoke st,70,値 / 値 = wpeek(st,70)
; dmFields : DEVMODE_FIELD_FLAGS (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; Anonymous1 : _Anonymous1_e__Union (+80, 8byte) varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; dmColor : DEVMODE_COLOR (+88, 2byte) wpoke st,88,値 / 値 = wpeek(st,88)
; dmDuplex : DEVMODE_DUPLEX (+90, 2byte) wpoke st,90,値 / 値 = wpeek(st,90)
; dmYResolution : SHORT (+92, 2byte) wpoke st,92,値 / 値 = wpeek(st,92)
; dmTTOption : DEVMODE_TRUETYPE_OPTION (+94, 2byte) wpoke st,94,値 / 値 = wpeek(st,94)
; dmCollate : DEVMODE_COLLATE (+96, 2byte) wpoke st,96,値 / 値 = wpeek(st,96)
; dmFormName : WCHAR (+98, 64byte) varptr(st)+98 を基点に操作(64byte:入れ子/配列)
; dmLogPixels : WORD (+162, 2byte) wpoke st,162,値 / 値 = wpeek(st,162)
; dmBitsPerPel : DWORD (+164, 4byte) st.41 = 値 / 値 = st.41 (lpoke/lpeek も可)
; dmPelsWidth : DWORD (+168, 4byte) st.42 = 値 / 値 = st.42 (lpoke/lpeek も可)
; dmPelsHeight : DWORD (+172, 4byte) st.43 = 値 / 値 = st.43 (lpoke/lpeek も可)
; Anonymous2 : _Anonymous2_e__Union (+176, 4byte) varptr(st)+176 を基点に操作(4byte:入れ子/配列)
; dmDisplayFrequency : DWORD (+180, 4byte) st.45 = 値 / 値 = st.45 (lpoke/lpeek も可)
; dmICMMethod : DWORD (+184, 4byte) st.46 = 値 / 値 = st.46 (lpoke/lpeek も可)
; dmICMIntent : DWORD (+188, 4byte) st.47 = 値 / 値 = st.47 (lpoke/lpeek も可)
; dmMediaType : DWORD (+192, 4byte) st.48 = 値 / 値 = st.48 (lpoke/lpeek も可)
; dmDitherType : DWORD (+196, 4byte) st.49 = 値 / 値 = st.49 (lpoke/lpeek も可)
; dmReserved1 : DWORD (+200, 4byte) st.50 = 値 / 値 = st.50 (lpoke/lpeek も可)
; dmReserved2 : DWORD (+204, 4byte) st.51 = 値 / 値 = st.51 (lpoke/lpeek も可)
; dmPanningWidth : DWORD (+208, 4byte) st.52 = 値 / 値 = st.52 (lpoke/lpeek も可)
; dmPanningHeight : DWORD (+212, 4byte) st.53 = 値 / 値 = st.53 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DEVMODEW
#field wchar dmDeviceName 32
#field short dmSpecVersion
#field short dmDriverVersion
#field short dmSize
#field short dmDriverExtra
#field int dmFields
#field byte Anonymous1 8
#field short dmColor
#field short dmDuplex
#field short dmYResolution
#field short dmTTOption
#field short dmCollate
#field wchar dmFormName 32
#field short dmLogPixels
#field int dmBitsPerPel
#field int dmPelsWidth
#field int dmPelsHeight
#field byte Anonymous2 4
#field int dmDisplayFrequency
#field int dmICMMethod
#field int dmICMIntent
#field int dmMediaType
#field int dmDitherType
#field int dmReserved1
#field int dmReserved2
#field int dmPanningWidth
#field int dmPanningHeight
#endstruct
stdim st, DEVMODEW ; NSTRUCT 変数を確保
st->dmSpecVersion = 100
mes "dmSpecVersion=" + st->dmSpecVersion
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。