Win32 API 日本語リファレンス
ホームMedia.Multimedia › MMIOINFO

MMIOINFO

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

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

フィールド

フィールドサイズx64x86説明
dwFlagsDWORD4+0+0MMIOの動作を制御するフラグ。バッファリングや割り当て方法等を示す。
fccIOProcDWORD4+4+4I/Oプロシージャを識別するFOURCC。ファイル種別やプロトコルを示す。
pIOProcLPMMIOPROC8/4+8+8カスタムI/Oプロシージャへの関数ポインタ。
wErrorRetDWORD4+16+12オープン時のエラーコードが返される領域。
htaskHTASK8/4+20+16ファイルを開いたタスクのハンドル。
cchBufferINT4+28+20I/Oバッファのサイズ。バイト単位で示す。
pchBufferCHAR*8/4+32+24I/Oバッファの先頭を指すポインタ。
pchNextCHAR*8/4+40+28次に読み書きする位置を指すポインタ。
pchEndReadCHAR*8/4+48+32読み取り可能領域の終端を指すポインタ。
pchEndWriteCHAR*8/4+56+36書き込み可能領域の終端を指すポインタ。
lBufOffsetINT4+64+40バッファ先頭のファイル内オフセット。
lDiskOffsetINT4+68+44現在のディスク上のファイルオフセット。
adwInfoDWORD12+72+48I/Oプロシージャが使用する追加情報の配列。
dwReserved1DWORD4+84+60予約済みフィールド。将来の拡張用で通常はゼロ。
dwReserved2DWORD4+88+64予約済みフィールド。将来の拡張用で通常はゼロ。
hmmioHMMIO8/4+92+68関連付けられたMMIOファイルのハンドル。

各言語での定義

#include <windows.h>

// MMIOINFO  (x64 100 / x86 72 バイト)
#pragma pack(push, 1)
typedef struct MMIOINFO {
    DWORD dwFlags;
    DWORD fccIOProc;
    LPMMIOPROC pIOProc;
    DWORD wErrorRet;
    HTASK htask;
    INT cchBuffer;
    CHAR* pchBuffer;
    CHAR* pchNext;
    CHAR* pchEndRead;
    CHAR* pchEndWrite;
    INT lBufOffset;
    INT lDiskOffset;
    DWORD adwInfo[3];
    DWORD dwReserved1;
    DWORD dwReserved2;
    HMMIO hmmio;
} MMIOINFO;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct MMIOINFO
{
    public uint dwFlags;
    public uint fccIOProc;
    public IntPtr pIOProc;
    public uint wErrorRet;
    public IntPtr htask;
    public int cchBuffer;
    public IntPtr pchBuffer;
    public IntPtr pchNext;
    public IntPtr pchEndRead;
    public IntPtr pchEndWrite;
    public int lBufOffset;
    public int lDiskOffset;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public uint[] adwInfo;
    public uint dwReserved1;
    public uint dwReserved2;
    public IntPtr hmmio;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure MMIOINFO
    Public dwFlags As UInteger
    Public fccIOProc As UInteger
    Public pIOProc As IntPtr
    Public wErrorRet As UInteger
    Public htask As IntPtr
    Public cchBuffer As Integer
    Public pchBuffer As IntPtr
    Public pchNext As IntPtr
    Public pchEndRead As IntPtr
    Public pchEndWrite As IntPtr
    Public lBufOffset As Integer
    Public lDiskOffset As Integer
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Public adwInfo() As UInteger
    Public dwReserved1 As UInteger
    Public dwReserved2 As UInteger
    Public hmmio As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class MMIOINFO(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("dwFlags", wintypes.DWORD),
        ("fccIOProc", wintypes.DWORD),
        ("pIOProc", ctypes.c_void_p),
        ("wErrorRet", wintypes.DWORD),
        ("htask", ctypes.c_void_p),
        ("cchBuffer", ctypes.c_int),
        ("pchBuffer", ctypes.c_void_p),
        ("pchNext", ctypes.c_void_p),
        ("pchEndRead", ctypes.c_void_p),
        ("pchEndWrite", ctypes.c_void_p),
        ("lBufOffset", ctypes.c_int),
        ("lDiskOffset", ctypes.c_int),
        ("adwInfo", wintypes.DWORD * 3),
        ("dwReserved1", wintypes.DWORD),
        ("dwReserved2", wintypes.DWORD),
        ("hmmio", ctypes.c_void_p),
    ]
#[repr(C, packed(1))]
pub struct MMIOINFO {
    pub dwFlags: u32,
    pub fccIOProc: u32,
    pub pIOProc: *mut core::ffi::c_void,
    pub wErrorRet: u32,
    pub htask: *mut core::ffi::c_void,
    pub cchBuffer: i32,
    pub pchBuffer: *mut core::ffi::c_void,
    pub pchNext: *mut core::ffi::c_void,
    pub pchEndRead: *mut core::ffi::c_void,
    pub pchEndWrite: *mut core::ffi::c_void,
    pub lBufOffset: i32,
    pub lDiskOffset: i32,
    pub adwInfo: [u32; 3],
    pub dwReserved1: u32,
    pub dwReserved2: u32,
    pub hmmio: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type MMIOINFO struct {
	dwFlags uint32
	fccIOProc uint32
	pIOProc uintptr
	wErrorRet uint32
	htask uintptr
	cchBuffer int32
	pchBuffer uintptr
	pchNext uintptr
	pchEndRead uintptr
	pchEndWrite uintptr
	lBufOffset int32
	lDiskOffset int32
	adwInfo [3]uint32
	dwReserved1 uint32
	dwReserved2 uint32
	hmmio uintptr
}
type
  MMIOINFO = packed record
    dwFlags: DWORD;
    fccIOProc: DWORD;
    pIOProc: Pointer;
    wErrorRet: DWORD;
    htask: Pointer;
    cchBuffer: Integer;
    pchBuffer: Pointer;
    pchNext: Pointer;
    pchEndRead: Pointer;
    pchEndWrite: Pointer;
    lBufOffset: Integer;
    lDiskOffset: Integer;
    adwInfo: array[0..2] of DWORD;
    dwReserved1: DWORD;
    dwReserved2: DWORD;
    hmmio: Pointer;
  end;
const MMIOINFO = extern struct {
    dwFlags: u32,
    fccIOProc: u32,
    pIOProc: ?*anyopaque,
    wErrorRet: u32,
    htask: ?*anyopaque,
    cchBuffer: i32,
    pchBuffer: ?*anyopaque,
    pchNext: ?*anyopaque,
    pchEndRead: ?*anyopaque,
    pchEndWrite: ?*anyopaque,
    lBufOffset: i32,
    lDiskOffset: i32,
    adwInfo: [3]u32,
    dwReserved1: u32,
    dwReserved2: u32,
    hmmio: ?*anyopaque,
};
type
  MMIOINFO {.packed.} = object
    dwFlags: uint32
    fccIOProc: uint32
    pIOProc: pointer
    wErrorRet: uint32
    htask: pointer
    cchBuffer: int32
    pchBuffer: pointer
    pchNext: pointer
    pchEndRead: pointer
    pchEndWrite: pointer
    lBufOffset: int32
    lDiskOffset: int32
    adwInfo: array[3, uint32]
    dwReserved1: uint32
    dwReserved2: uint32
    hmmio: pointer
align(1)
struct MMIOINFO
{
    uint dwFlags;
    uint fccIOProc;
    void* pIOProc;
    uint wErrorRet;
    void* htask;
    int cchBuffer;
    void* pchBuffer;
    void* pchNext;
    void* pchEndRead;
    void* pchEndWrite;
    int lBufOffset;
    int lDiskOffset;
    uint[3] adwInfo;
    uint dwReserved1;
    uint dwReserved2;
    void* hmmio;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; MMIOINFO サイズ: 72 バイト(x86)
dim st, 18    ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; dwFlags : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; fccIOProc : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; pIOProc : LPMMIOPROC (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; wErrorRet : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; htask : HTASK (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; cchBuffer : INT (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; pchBuffer : CHAR* (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; pchNext : CHAR* (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; pchEndRead : CHAR* (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; pchEndWrite : CHAR* (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; lBufOffset : INT (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; lDiskOffset : INT (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; adwInfo : DWORD (+48, 12byte)  varptr(st)+48 を基点に操作(12byte:入れ子/配列)
; dwReserved1 : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; dwReserved2 : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; hmmio : HMMIO (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; MMIOINFO サイズ: 100 バイト(x64)
dim st, 25    ; 4byte整数×25(構造体サイズ 100 / 4 切り上げ)
; dwFlags : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; fccIOProc : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; pIOProc : LPMMIOPROC (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; wErrorRet : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; htask : HTASK (+20, 8byte)  qpoke st,20,値 / qpeek(st,20)  ※IronHSPのみ。3.7/3.8は lpoke st,20,下位 : lpoke st,24,上位
; cchBuffer : INT (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; pchBuffer : CHAR* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; pchNext : CHAR* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; pchEndRead : CHAR* (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; pchEndWrite : CHAR* (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; lBufOffset : INT (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; lDiskOffset : INT (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; adwInfo : DWORD (+72, 12byte)  varptr(st)+72 を基点に操作(12byte:入れ子/配列)
; dwReserved1 : DWORD (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; dwReserved2 : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; hmmio : HMMIO (+92, 8byte)  qpoke st,92,値 / qpeek(st,92)  ※IronHSPのみ。3.7/3.8は lpoke st,92,下位 : lpoke st,96,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global MMIOINFO, pack=1
    #field int dwFlags
    #field int fccIOProc
    #field intptr pIOProc
    #field int wErrorRet
    #field intptr htask
    #field int cchBuffer
    #field intptr pchBuffer
    #field intptr pchNext
    #field intptr pchEndRead
    #field intptr pchEndWrite
    #field int lBufOffset
    #field int lDiskOffset
    #field int adwInfo 3
    #field int dwReserved1
    #field int dwReserved2
    #field intptr hmmio
#endstruct

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