Win32 API 日本語リファレンス
ホームGraphics.Gdi › DEVMODEW

DEVMODEW

構造体
サイズx64: 216 バイト / x86: 208 バイト

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

フィールド

フィールドサイズx64x86説明
dmDeviceNameWCHAR64+0+0

ディスプレイの場合は、ディスプレイドライバーの DLL の名前を指定します。たとえば、3Dlabs Permedia3 ディスプレイドライバーの場合は "perm3dd" です。

プリンターの場合は「フレンドリ名」を指定します。たとえば PCL/HP LaserJet の場合は "PCL/HP LaserJet" です。名前の長さが CCHDEVICENAME 文字を超える場合、スプーラーは配列に収まるように切り詰めます。

dmSpecVersionWORD2+64+64この DEVMODEW 構造体のバージョン番号を指定します。現在のバージョン番号は wingdi.hDM_SPECVERSION 定数で識別されます。
dmDriverVersionWORD2+66+66

プリンターの場合、プリンタードライバーの開発者が割り当てたプリンタードライバーのバージョン番号を指定します。

ディスプレイドライバーは、このメンバーに DM_SPECVERSION を設定できます。

dmSizeWORD2+68+68public な DEVMODEW 構造体のサイズをバイト単位で指定します。dmDriverExtra メンバーで示される、ドライバー固有のプライベートメンバーは含みません。
dmDriverExtraWORD2+70+70public な構造体メンバーの後ろに続く、プライベートなドライバーデータのバイト数を指定します。デバイスドライバーがプライベートな DEVMODEW メンバーを提供しない場合、このメンバーは 0 に設定してください。
dmFieldsDEVMODE_FIELD_FLAGS4+72+72以下の DEVMODEW メンバーのうち、どれが使用されているかを示すビットフラグを指定します。たとえば、dmOrientation メンバーが有効なデータを含む場合には DM_ORIENTATION フラグが設定されます。DM_XXX フラグは wingdi.h で定義されています。
Anonymous1_Anonymous1_e__Union8/4+80+76印刷の向きや位置などを保持する無名共用体。
dmColorDEVMODE_COLOR2+88+80

プリンターの場合、カラープリンターがカラーで印刷するかモノクロで印刷するかを指定します。このメンバーには DMCOLOR_COLOR または DMCOLOR_MONOCHROME のいずれかを指定できます。

このメンバーはディスプレイでは使用されません。

dmDuplexDEVMODE_DUPLEX2+90+82

プリンターの場合、両面印刷に対応したプリンターでの両面印刷を指定します。このメンバーには次のいずれかの値を指定できます。

DMDUP_HORIZONTAL

短辺とじで両面印刷します。

DMDUP_SIMPLEX

片面印刷します。

DMDUP_VERTICAL

長辺とじで両面印刷します。

このメンバーはディスプレイでは使用されません。

dmYResolutionSHORT2+92+84

プリンターの場合、プリンターの y 方向の解像度を DPI 単位で指定します。このメンバーを使用する場合、dmPrintQuality メンバーが x 方向の解像度を指定します。

このメンバーはディスプレイでは使用されません。

dmTTOptionDEVMODE_TRUETYPE_OPTION2+94+86

プリンターの場合、TrueType フォントをどのように印刷するかを指定します。このメンバーは wingdi.h で定義されている DMTT で始まる定数のいずれかでなければなりません。

このメンバーはディスプレイでは使用されません。

dmCollateDEVMODE_COLLATE2+96+88

プリンターの場合、複数部を印刷するときに部単位で印刷するかどうかを指定します。このメンバーには次のいずれかの値を指定できます。

DMCOLLATE_TRUE

複数部を印刷するときに部単位でそろえます。

DMCOLLATE_FALSE

複数部を印刷するときに部単位でそろえません。

このメンバーはディスプレイでは使用されません。

dmFormNameWCHAR64+98+90

プリンターの場合、使用するフォームの名前 ("Letter" や "Legal" など) を指定します。これは Win32 の EnumForms 関数を呼び出して取得できる名前でなければなりません。

このメンバーはディスプレイでは使用されません。

dmLogPixelsWORD2+162+154

ディスプレイの場合、ディスプレイデバイスの 1 インチあたりの論理ピクセル数を指定します。この値は GDIINFO 構造体の ulLogPixels メンバーと等しくなければなりません。

このメンバーはプリンターでは使用されません。

dmBitsPerPelDWORD4+164+156

ディスプレイの場合、ディスプレイデバイスの色の解像度を 1 ピクセルあたりのビット数で指定します。

このメンバーはプリンターでは使用されません。

dmPelsWidthDWORD4+168+160

ディスプレイの場合、表示可能なデバイスサーフェスの幅をピクセル単位で指定します。

このメンバーはプリンターでは使用されません。

dmPelsHeightDWORD4+172+164

ディスプレイの場合、表示可能なデバイスサーフェスの高さをピクセル単位で指定します。

このメンバーはプリンターでは使用されません。

Anonymous2_Anonymous2_e__Union4+176+168表示フラグやニブル数を保持する無名共用体。
dmDisplayFrequencyDWORD4+180+172

ディスプレイの場合、現在のモードにおけるディスプレイデバイスの周波数をヘルツ単位で指定します。

このメンバーはプリンターでは使用されません。

dmICMMethodDWORD4+184+176wingdi.h で定義されている DMICMMETHOD で始まる定数のいずれかを指定します。
dmICMIntentDWORD4+188+180wingdi.h で定義されている DMICM で始まる定数のいずれかを指定します。
dmMediaTypeDWORD4+192+184wingdi.h で定義されている DMMEDIA で始まる定数のいずれかを指定します。
dmDitherTypeDWORD4+196+188wingdi.h で定義されている DMDITHER で始まる定数のいずれかを指定します。
dmReserved1DWORD4+200+192システムでの使用のために予約済みです。ドライバーは無視してください。
dmReserved2DWORD4+204+196システムでの使用のために予約済みです。ドライバーは無視してください。
dmPanningWidthDWORD4+208+200システムでの使用のために予約済みです。ドライバーは無視してください。
dmPanningHeightDWORD4+212+204

システムでの使用のために予約済みです。ドライバーは無視してください。

- dmDisplayFlags.DM_GRAYSCALE

ディスプレイがカラーデバイスではないことを指定します。このフラグが設定されていない場合はカラーとみなされます。

- dmDisplayFlags.DM_INTERLACED

表示モードがインターレースであることを指定します。このフラグが設定されていない場合はノンインターレースとみなされます。

共用体: _Anonymous1_e__Union x64 8B / x86 4B

フィールドサイズx64x86説明
Anonymous1_Anonymous1_e__Struct8/4+0+0印刷の向きや位置などを保持する無名共用体。
Anonymous2_Anonymous2_e__Struct8/4+0+0表示フラグやニブル数を保持する無名共用体。

共用体: _Anonymous2_e__Union x64 4B / x86 4B

フィールドサイズx64x86説明
dmDisplayFlagsDWORD4+0+0

デバイスの表示モードを指定します。このメンバーには次の値の組み合わせを指定できます。

意味
DM_GRAYSCALE ディスプレイがカラー非対応のデバイスであることを指定します。このフラグが設定されていない場合はカラーとみなされます。このフラグは現在では有効ではありません。
DM_INTERLACED 表示モードがインターレースであることを指定します。このフラグが設定されていない場合はノンインターレースとみなされます。

このメンバーはディスプレイドライバーが使用します。たとえば ChangeDisplaySettings 関数で使用されます。プリンタードライバーはこのメンバーを使用しません。

dmNupDWORD4+0+0

プリンターの場合、印刷システムが「N-up」印刷 (複数の EMF 論理ページを 1 枚の物理ページに再生すること) を処理するかどうかを指定します。このメンバーの値は次のいずれかです。

意味
DMNUP_SYSTEM 印刷システムが「N-up」印刷を処理します。
DMNUP_ONEUP 印刷システムは「N-up」印刷を処理しません。アプリケーションが自身で「N-up」印刷を行う場合は、dmNupDMNUP_ONEUP を設定できます。

このメンバーはディスプレイでは使用されません。

公式ドキュメント

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 が有効性を確認するのは DEVMODEW の public 部分のみです。しかし、構造体のプライベート部分のデータが破損していると、アプリケーション内またはスプーラープロセス内でドライバーのコードがクラッシュする可能性があります。したがってドライバーは、DEVMODEW のデータを使用する前に毎回、DEVMODEW のプライベート部分が正しい形式であることを検証してください。
Windows 2000 では、DEVMODEW 構造体に新しい union メンバーが追加されました。この union メンバーには、既存の DEVMODEW 構造体メンバーである dmDisplayFlags と、新しいメンバーである dmNup が含まれます。このメンバーについては前述のメンバーのセクションで説明しています。

Windows XP では、新しい struct メンバーが追加されました。この struct メンバーには、既存の DEVMODEW 構造体メンバーである dmPosition と、新しい 2 つのメンバーである dmDisplayOrientation および dmDisplayFixedOutput が含まれます。これらのメンバーについては前述のメンバーのセクションで説明しています。

さらに Windows XP では、DEVMODEW 構造体のいくつかのメンバーが構造体内の別の位置に移動されました。dmScaledmCopiesdmDefaultSourcedmPrintQuality の各メンバーは、dmOrientationdmPaperSizedmPaperLengthdmPaperWidth の各メンバーを含む struct メンバーの末尾に追加されました。

メモ

wingdi.h ヘッダーは、UNICODE プリプロセッサ定数の定義に応じて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして DEVMODE を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じてコンパイルエラーや実行時エラーの原因となることがあります。詳細については、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>

// 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 Structure
import 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: uint32
struct 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 非対応)。必要に応じ手動でアクセス。