ホーム › Media.Multimedia › MMIOINFO
MMIOINFO
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| dwFlags | DWORD | 4 | +0 | +0 | MMIOの動作を制御するフラグ。バッファリングや割り当て方法等を示す。 |
| fccIOProc | DWORD | 4 | +4 | +4 | I/Oプロシージャを識別するFOURCC。ファイル種別やプロトコルを示す。 |
| pIOProc | LPMMIOPROC | 8/4 | +8 | +8 | カスタムI/Oプロシージャへの関数ポインタ。 |
| wErrorRet | DWORD | 4 | +16 | +12 | オープン時のエラーコードが返される領域。 |
| htask | HTASK | 8/4 | +20 | +16 | ファイルを開いたタスクのハンドル。 |
| cchBuffer | INT | 4 | +28 | +20 | I/Oバッファのサイズ。バイト単位で示す。 |
| pchBuffer | CHAR* | 8/4 | +32 | +24 | I/Oバッファの先頭を指すポインタ。 |
| pchNext | CHAR* | 8/4 | +40 | +28 | 次に読み書きする位置を指すポインタ。 |
| pchEndRead | CHAR* | 8/4 | +48 | +32 | 読み取り可能領域の終端を指すポインタ。 |
| pchEndWrite | CHAR* | 8/4 | +56 | +36 | 書き込み可能領域の終端を指すポインタ。 |
| lBufOffset | INT | 4 | +64 | +40 | バッファ先頭のファイル内オフセット。 |
| lDiskOffset | INT | 4 | +68 | +44 | 現在のディスク上のファイルオフセット。 |
| adwInfo | DWORD | 12 | +72 | +48 | I/Oプロシージャが使用する追加情報の配列。 |
| dwReserved1 | DWORD | 4 | +84 | +60 | 予約済みフィールド。将来の拡張用で通常はゼロ。 |
| dwReserved2 | DWORD | 4 | +88 | +64 | 予約済みフィールド。将来の拡張用で通常はゼロ。 |
| hmmio | HMMIO | 8/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 Structureimport 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: pointeralign(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