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

DD_LOCKDATA

構造体
サイズx64: 80 バイト / x86: 48 バイト

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

フィールド

フィールドサイズx64x86説明
lpDDDD_DIRECTDRAW_GLOBAL*8/4+0+0ドライバーのデバイスを記述する DD_DIRECTDRAW_GLOBAL 構造体を指します。
lpDDSurfaceDD_SURFACE_LOCAL*8/4+8+4ロックダウンするメモリ領域に関連付けられたサーフェス (LockD3DBuffer の場合はバッファー) を記述する DD_SURFACE_LOCAL 構造体を指します。
bHasRectDWORD4+16+8rArea の領域が有効かどうかを指定します。値 0x00000001 は領域が有効であることを示し、0x00000000 は領域が無効であることを示します。
rAreaRECTL16+20+12ロックダウンするサーフェス上の領域を定義する RECTL 構造体を指定します。
lpSurfDatavoid*8/4+40+28ドライバーがロックダウンしたメモリ領域へのポインターを返す場所を指定します。
ddRValHRESULT4+48+32ドライバーが DdLock または LockD3DBuffer コールバックの戻り値を書き込む場所を指定します。戻りコード DD_OK は成功を示します。詳細については、Return Values for DirectDraw を参照してください。
Lockvoid*8/4+56+36DirectDraw API によって使用されるため、ドライバーが値を設定してはなりません。
dwFlagsDWORD4+64+40

ドライバーがメモリのロックダウンをどのように実行するかを指示するビットマスクを指定します。このメンバーは、次の値のビット単位の OR です。

フラグ 意味
DDLOCK_DISCARDCONTENTS
このロックの間、サーフェスまたは頂点バッファーの内容については何も仮定されません。これにより次の 2 つのことが可能になります。
1. Microsoft Direct3D またはドライバーが、頂点バッファーとして別のメモリ領域を提供する場合があります。これは、頂点バッファーの内容を消去して新しいデータを書き込む予定がある場合に役立ちます。
2. ドライバーは、サーフェスデータを並べ替えた形式で格納することがあります。アプリケーションがサーフェスをロックすると、ドライバーはアプリケーションにサーフェスの内容を見せる前に、このサーフェスデータの並べ替えを元に戻す必要があります。

このフラグは、アプリケーションがサーフェスまたはロックされた矩形内のすべてのピクセルを上書きする予定である (したがって、並べ替えを元に戻したピクセルはいずれにせよ消去される) ため、並べ替えを元に戻す処理を省略できることをドライバーに伝えるヒントです。アプリケーションは、サーフェスまたはロックされた矩形の全体を上書きするつもりである場合、常にこのフラグを設定してください。

DDLOCK_DONOTWAIT IDirectDrawSurface7 以降のインターフェイスでは、既定値は DDLOCK_WAIT です。既定の動作を上書きして、アクセラレーターがビジー状態 (DDERR_WASSTILLDRAWING の戻りコードで示されます) の間の時間を利用したい場合は、このフラグを使用します。
DDLOCK_EVENT 要求されたサーフェスメモリのポインターを返せるようになったときにイベントをトリガーするイベントハンドルが Lock に渡される場合に設定します。
DDLOCK_HASVOLUMETEXTUREBOXRECT ドライバーは、rArea の矩形 (RECTL) で指定されたサブボリュームテクスチャの先頭を指す有効なメモリポインターを返す必要があります。ドライバーは、サブボリュームの前面と背面の座標を、それぞれ left 座標と right 座標 (RECTL の left メンバーと right メンバー) の上位 16 ビットから取得します。left 座標と right 座標は下位 16 ビットに制限されます。矩形が指定されていない場合、ドライバーはボリューム全体の先頭を指すポインターを返す必要があります。この値は DirectX 8.1 以降で使用できます。
DDLOCK_NODIRTYUPDATE
アプリケーションが D3DLOCK_NO_DIRTY_UPDATE フラグを設定してメモリ領域のロックダウンを要求した後に、ランタイムからドライバーへ送信されます。この場合、ドライバーは、この領域を含むサーフェスを更新するためにランタイムがドライバーの DdUnlock 関数を呼び出したときに、ロックダウンしたメモリ領域をダーティと見なしてはなりません。代わりにドライバーは、D3DDP2OP_ADDDIRTYRECT および D3DDP2OP_ADDDIRTYBOX 列挙子を使用して D3dDrawPrimitives2 関数を呼び出した際に指定された領域のみをダーティと見なす必要があります。
既定では、サーフェスに対するロックはそのサーフェスにダーティ領域を追加します。
DDLOCK_NOOVERWRITE Direct3D の頂点バッファーのロックでのみ使用されます。フレームの開始以降 (またはこのフラグを指定しない直近のロック以降) に IDirect3DDevice7::DrawPrimitiveVB および IDirect3DDevice7::DrawIndexedPrimitiveVB の呼び出し (Direct3D SDK ドキュメントで説明されています) で参照された頂点が、このロックの間に変更されないことを示します。これは、頂点バッファーにデータを追加するだけの場合に役立ちます。
DDLOCK_NOSYSLOCK
このサーフェスをロックするときに、システム全体のロックを取得しないことを示します。これはビデオメモリサーフェスをロックする際に、カーソルの応答性、より多くの Microsoft Windows 関数を呼び出せること、デバッグが容易になることなど、いくつかの利点があります。ただし、このフラグを指定するアプリケーションは、ヘルプファイルに記載されている多くの条件を満たす必要があります。
プライマリサーフェスをロックする場合、このフラグは指定できません。
DDLOCK_OKTOSWAP DDLOCK_DISCARDCONTENTS と同じです。
DDLOCK_READONLY ロックされるサーフェスは読み取りのみが行われます。Windows 2000 以降では、このフラグが設定されることはありません。
DDLOCK_SURFACEMEMORYPTR ドライバーは、rArea で指定された矩形の先頭を指す有効なメモリポインターを返す必要があります。矩形が指定されていない場合、ドライバーはサーフェスの先頭を指すポインターを返す必要があります。
DDLOCK_WAIT 有効なメモリポインターを取得できるまで Lock が待機してから戻ることを示すために設定します。このビットが設定されている場合、Lock が DDERR_WASSTILLDRAWING を返すことはありません。
DDLOCK_WRITEONLY ロックされるサーフェスは書き込みのみが行われます。Windows 2000 以降では、このフラグが設定されることはありません。
fpProcessUINT_PTR8/4+72+44ドライバーのメモリのユーザーモードマッピングへのポインターを指定します。ドライバーはこのマッピングを DdMapMemory で行います。Windows 2000 以降のみ。

公式ドキュメント

DD_LOCKDATA 構造体には、Microsoft DirectDraw のパラメーター構造体で定義されるロックを実行するために必要な情報が格納されます。

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

各言語での定義

#include <windows.h>

// RECTL  (x64 16 / x86 16 バイト)
typedef struct RECTL {
    INT left;
    INT top;
    INT right;
    INT bottom;
} RECTL;

// DD_LOCKDATA  (x64 80 / x86 48 バイト)
typedef struct DD_LOCKDATA {
    DD_DIRECTDRAW_GLOBAL* lpDD;
    DD_SURFACE_LOCAL* lpDDSurface;
    DWORD bHasRect;
    RECTL rArea;
    void* lpSurfData;
    HRESULT ddRVal;
    void* Lock;
    DWORD dwFlags;
    UINT_PTR fpProcess;
} DD_LOCKDATA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RECTL
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DD_LOCKDATA
{
    public IntPtr lpDD;
    public IntPtr lpDDSurface;
    public uint bHasRect;
    public RECTL rArea;
    public IntPtr lpSurfData;
    public int ddRVal;
    public IntPtr Lock;
    public uint dwFlags;
    public UIntPtr fpProcess;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RECTL
    Public left As Integer
    Public top As Integer
    Public right As Integer
    Public bottom As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DD_LOCKDATA
    Public lpDD As IntPtr
    Public lpDDSurface As IntPtr
    Public bHasRect As UInteger
    Public rArea As RECTL
    Public lpSurfData As IntPtr
    Public ddRVal As Integer
    Public Lock As IntPtr
    Public dwFlags As UInteger
    Public fpProcess As UIntPtr
End Structure
import ctypes
from ctypes import wintypes

class RECTL(ctypes.Structure):
    _fields_ = [
        ("left", ctypes.c_int),
        ("top", ctypes.c_int),
        ("right", ctypes.c_int),
        ("bottom", ctypes.c_int),
    ]

class DD_LOCKDATA(ctypes.Structure):
    _fields_ = [
        ("lpDD", ctypes.c_void_p),
        ("lpDDSurface", ctypes.c_void_p),
        ("bHasRect", wintypes.DWORD),
        ("rArea", RECTL),
        ("lpSurfData", ctypes.c_void_p),
        ("ddRVal", ctypes.c_int),
        ("Lock", ctypes.c_void_p),
        ("dwFlags", wintypes.DWORD),
        ("fpProcess", ctypes.c_size_t),
    ]
#[repr(C)]
pub struct RECTL {
    pub left: i32,
    pub top: i32,
    pub right: i32,
    pub bottom: i32,
}

#[repr(C)]
pub struct DD_LOCKDATA {
    pub lpDD: *mut core::ffi::c_void,
    pub lpDDSurface: *mut core::ffi::c_void,
    pub bHasRect: u32,
    pub rArea: RECTL,
    pub lpSurfData: *mut core::ffi::c_void,
    pub ddRVal: i32,
    pub Lock: *mut core::ffi::c_void,
    pub dwFlags: u32,
    pub fpProcess: usize,
}
import "golang.org/x/sys/windows"

type RECTL struct {
	left int32
	top int32
	right int32
	bottom int32
}

type DD_LOCKDATA struct {
	lpDD uintptr
	lpDDSurface uintptr
	bHasRect uint32
	rArea RECTL
	lpSurfData uintptr
	ddRVal int32
	Lock uintptr
	dwFlags uint32
	fpProcess uintptr
}
type
  RECTL = record
    left: Integer;
    top: Integer;
    right: Integer;
    bottom: Integer;
  end;

  DD_LOCKDATA = record
    lpDD: Pointer;
    lpDDSurface: Pointer;
    bHasRect: DWORD;
    rArea: RECTL;
    lpSurfData: Pointer;
    ddRVal: Integer;
    Lock: Pointer;
    dwFlags: DWORD;
    fpProcess: NativeUInt;
  end;
const RECTL = extern struct {
    left: i32,
    top: i32,
    right: i32,
    bottom: i32,
};

const DD_LOCKDATA = extern struct {
    lpDD: ?*anyopaque,
    lpDDSurface: ?*anyopaque,
    bHasRect: u32,
    rArea: RECTL,
    lpSurfData: ?*anyopaque,
    ddRVal: i32,
    Lock: ?*anyopaque,
    dwFlags: u32,
    fpProcess: usize,
};
type
  RECTL {.bycopy.} = object
    left: int32
    top: int32
    right: int32
    bottom: int32

  DD_LOCKDATA {.bycopy.} = object
    lpDD: pointer
    lpDDSurface: pointer
    bHasRect: uint32
    rArea: RECTL
    lpSurfData: pointer
    ddRVal: int32
    Lock: pointer
    dwFlags: uint32
    fpProcess: uint
struct RECTL
{
    int left;
    int top;
    int right;
    int bottom;
}

struct DD_LOCKDATA
{
    void* lpDD;
    void* lpDDSurface;
    uint bHasRect;
    RECTL rArea;
    void* lpSurfData;
    int ddRVal;
    void* Lock;
    uint dwFlags;
    size_t fpProcess;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DD_LOCKDATA サイズ: 48 バイト(x86)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; lpDD : DD_DIRECTDRAW_GLOBAL* (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; lpDDSurface : DD_SURFACE_LOCAL* (+4, 4byte)  varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; bHasRect : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; rArea : RECTL (+12, 16byte)  varptr(st)+12 を基点に操作(16byte:入れ子/配列)
; lpSurfData : void* (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; ddRVal : HRESULT (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; Lock : void* (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; dwFlags : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; fpProcess : UINT_PTR (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DD_LOCKDATA サイズ: 80 バイト(x64)
dim st, 20    ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; lpDD : DD_DIRECTDRAW_GLOBAL* (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; lpDDSurface : DD_SURFACE_LOCAL* (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; bHasRect : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; rArea : RECTL (+20, 16byte)  varptr(st)+20 を基点に操作(16byte:入れ子/配列)
; lpSurfData : void* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; ddRVal : HRESULT (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; Lock : void* (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; dwFlags : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; fpProcess : UINT_PTR (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global RECTL
    #field int left
    #field int top
    #field int right
    #field int bottom
#endstruct

#defstruct global DD_LOCKDATA
    #field intptr lpDD
    #field intptr lpDDSurface
    #field int bHasRect
    #field RECTL rArea
    #field intptr lpSurfData
    #field int ddRVal
    #field intptr Lock
    #field int dwFlags
    #field intptr fpProcess
#endstruct

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