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

ICDrawBegin

関数
映像フレームの描画準備を開始する。
DLLMSVFW32.dll呼出規約cdecl対応OSWindows 2000 以降

シグネチャ

// MSVFW32.dll
#include <windows.h>

DWORD ICDrawBegin(
    HIC hic,
    DWORD dwFlags,
    HPALETTE hpal,   // optional
    HWND hwnd,   // optional
    HDC hdc,   // optional
    INT xDst,
    INT yDst,
    INT dxDst,
    INT dyDst,
    BITMAPINFOHEADER* lpbi,
    INT xSrc,
    INT ySrc,
    INT dxSrc,
    INT dySrc,
    DWORD dwRate,
    DWORD dwScale
);

パラメーター

名前方向説明
hicHICin使用するデコンプレッサーへのハンドル。
dwFlagsDWORDin

展開フラグ。次の値が定義されています。

意味
ICDRAW_ANIMATE アプリケーションがパレットをアニメーション化できます。
ICDRAW_CONTINUE 描画は前のフレームの継続です。
ICDRAW_FULLSCREEN 展開したデータを全画面に描画します。
ICDRAW_HDC 展開したデータをウィンドウまたは DC に描画します。
ICDRAW_MEMORYDC DC はオフスクリーンです。
ICDRAW_QUERY デコンプレッサーがデータを展開できるかどうかを判定します。ドライバーはデータを展開しません。
ICDRAW_UPDATING 現在のフレームは再生ではなく更新されています。
hpalHPALETTEinoptional描画に使用するパレットへのハンドル。
hwndHWNDinoptional描画に使用するウィンドウへのハンドル。
hdcHDCinoptional描画に使用する DC。
xDstINTin描画先矩形の右上隅の x 座標。
yDstINTin描画先矩形の右上隅の y 座標。
dxDstINTin描画先矩形の幅。
dyDstINTin描画先矩形の高さ。
lpbiBITMAPINFOHEADER*in展開する入力データの形式を格納した BITMAPINFOHEADER 構造体へのポインター。
xSrcINTinソース矩形の右上隅の x 座標。
ySrcINTinソース矩形の右上隅の y 座標。
dxSrcINTinソース矩形の幅。
dySrcINTinソース矩形の高さ。
dwRateDWORDinフレームレートの分子。1 秒あたりのフレーム数で表したフレームレートは、dwRatedwScale で割ることで得られます。
dwScaleDWORDinフレームレートの分母。1 秒あたりのフレーム数で表したフレームレートは、dwRatedwScale で割ることで得られます。

戻り値の型: DWORD

公式ドキュメント

ICDrawBegin 関数は、レンダラーを初期化し、描画先を描画用に準備します。

戻り値

レンダラーがデータを展開できる場合は ICERR_OK を返し、そうでない場合は ICERR_UNSUPPORTED を返します。

解説(Remarks)

ICDRAW_HDC フラグと ICDRAW_FULLSCREEN フラグは相互排他的です。アプリケーションが dwFlags に ICDRAW_HDC フラグを設定した場合、デコンプレッサーは hwndhdc、および描画先矩形を定義するパラメーター(xDstyDstdxDstdyDst)を使用します。アプリケーションはこれらのパラメーターに描画先矩形のサイズを設定する必要があります。描画先矩形の値は、現在のウィンドウまたは DC を基準に指定します。

アプリケーションが dwFlagsICDRAW_FULLSCREEN フラグを設定した場合、hwnd および hdc パラメーターは使用されず、NULL に設定する必要があります。また、描画先矩形は使用されず、そのパラメーターは 0 に設定できます。

ソース矩形はビデオフレーム全体を基準とします。ソース矩形で指定されたビデオフレームの部分は、描画先矩形に合わせて拡大または縮小されます。

dwRate および dwScale パラメーターは展開レートを指定します。dwRate に指定した整数値を dwScale に指定した整数値で割った値が、1 秒あたりのフレーム数で表したフレームレートを定義します。この値は、再生中のフレームのタイミングをレンダラーが担当する場合に使用されます。

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

各言語での呼び出し定義

// MSVFW32.dll
#include <windows.h>

DWORD ICDrawBegin(
    HIC hic,
    DWORD dwFlags,
    HPALETTE hpal,   // optional
    HWND hwnd,   // optional
    HDC hdc,   // optional
    INT xDst,
    INT yDst,
    INT dxDst,
    INT dyDst,
    BITMAPINFOHEADER* lpbi,
    INT xSrc,
    INT ySrc,
    INT dxSrc,
    INT dySrc,
    DWORD dwRate,
    DWORD dwScale
);
[DllImport("MSVFW32.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
static extern uint ICDrawBegin(
    IntPtr hic,   // HIC
    uint dwFlags,   // DWORD
    IntPtr hpal,   // HPALETTE optional
    IntPtr hwnd,   // HWND optional
    IntPtr hdc,   // HDC optional
    int xDst,   // INT
    int yDst,   // INT
    int dxDst,   // INT
    int dyDst,   // INT
    IntPtr lpbi,   // BITMAPINFOHEADER*
    int xSrc,   // INT
    int ySrc,   // INT
    int dxSrc,   // INT
    int dySrc,   // INT
    uint dwRate,   // DWORD
    uint dwScale   // DWORD
);
<DllImport("MSVFW32.dll", ExactSpelling:=True, CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function ICDrawBegin(
    hic As IntPtr,   ' HIC
    dwFlags As UInteger,   ' DWORD
    hpal As IntPtr,   ' HPALETTE optional
    hwnd As IntPtr,   ' HWND optional
    hdc As IntPtr,   ' HDC optional
    xDst As Integer,   ' INT
    yDst As Integer,   ' INT
    dxDst As Integer,   ' INT
    dyDst As Integer,   ' INT
    lpbi As IntPtr,   ' BITMAPINFOHEADER*
    xSrc As Integer,   ' INT
    ySrc As Integer,   ' INT
    dxSrc As Integer,   ' INT
    dySrc As Integer,   ' INT
    dwRate As UInteger,   ' DWORD
    dwScale As UInteger   ' DWORD
) As UInteger
End Function
' hic : HIC
' dwFlags : DWORD
' hpal : HPALETTE optional
' hwnd : HWND optional
' hdc : HDC optional
' xDst : INT
' yDst : INT
' dxDst : INT
' dyDst : INT
' lpbi : BITMAPINFOHEADER*
' xSrc : INT
' ySrc : INT
' dxSrc : INT
' dySrc : INT
' dwRate : DWORD
' dwScale : DWORD
Declare PtrSafe Function ICDrawBegin Lib "msvfw32" ( _
    ByVal hic As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal hpal As LongPtr, _
    ByVal hwnd As LongPtr, _
    ByVal hdc As LongPtr, _
    ByVal xDst As Long, _
    ByVal yDst As Long, _
    ByVal dxDst As Long, _
    ByVal dyDst As Long, _
    ByVal lpbi As LongPtr, _
    ByVal xSrc As Long, _
    ByVal ySrc As Long, _
    ByVal dxSrc As Long, _
    ByVal dySrc As Long, _
    ByVal dwRate As Long, _
    ByVal dwScale As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

ICDrawBegin = ctypes.cdll.msvfw32.ICDrawBegin
ICDrawBegin.restype = wintypes.DWORD
ICDrawBegin.argtypes = [
    wintypes.HANDLE,  # hic : HIC
    wintypes.DWORD,  # dwFlags : DWORD
    wintypes.HANDLE,  # hpal : HPALETTE optional
    wintypes.HANDLE,  # hwnd : HWND optional
    wintypes.HANDLE,  # hdc : HDC optional
    ctypes.c_int,  # xDst : INT
    ctypes.c_int,  # yDst : INT
    ctypes.c_int,  # dxDst : INT
    ctypes.c_int,  # dyDst : INT
    ctypes.c_void_p,  # lpbi : BITMAPINFOHEADER*
    ctypes.c_int,  # xSrc : INT
    ctypes.c_int,  # ySrc : INT
    ctypes.c_int,  # dxSrc : INT
    ctypes.c_int,  # dySrc : INT
    wintypes.DWORD,  # dwRate : DWORD
    wintypes.DWORD,  # dwScale : DWORD
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('MSVFW32.dll')
ICDrawBegin = Fiddle::Function.new(
  lib['ICDrawBegin'],
  [
    Fiddle::TYPE_VOIDP,  # hic : HIC
    -Fiddle::TYPE_INT,  # dwFlags : DWORD
    Fiddle::TYPE_VOIDP,  # hpal : HPALETTE optional
    Fiddle::TYPE_VOIDP,  # hwnd : HWND optional
    Fiddle::TYPE_VOIDP,  # hdc : HDC optional
    Fiddle::TYPE_INT,  # xDst : INT
    Fiddle::TYPE_INT,  # yDst : INT
    Fiddle::TYPE_INT,  # dxDst : INT
    Fiddle::TYPE_INT,  # dyDst : INT
    Fiddle::TYPE_VOIDP,  # lpbi : BITMAPINFOHEADER*
    Fiddle::TYPE_INT,  # xSrc : INT
    Fiddle::TYPE_INT,  # ySrc : INT
    Fiddle::TYPE_INT,  # dxSrc : INT
    Fiddle::TYPE_INT,  # dySrc : INT
    -Fiddle::TYPE_INT,  # dwRate : DWORD
    -Fiddle::TYPE_INT,  # dwScale : DWORD
  ],
  -Fiddle::TYPE_INT, Fiddle::Function::CDECL)
#[link(name = "msvfw32")]
extern "C" {
    fn ICDrawBegin(
        hic: *mut core::ffi::c_void,  // HIC
        dwFlags: u32,  // DWORD
        hpal: *mut core::ffi::c_void,  // HPALETTE optional
        hwnd: *mut core::ffi::c_void,  // HWND optional
        hdc: *mut core::ffi::c_void,  // HDC optional
        xDst: i32,  // INT
        yDst: i32,  // INT
        dxDst: i32,  // INT
        dyDst: i32,  // INT
        lpbi: *mut BITMAPINFOHEADER,  // BITMAPINFOHEADER*
        xSrc: i32,  // INT
        ySrc: i32,  // INT
        dxSrc: i32,  // INT
        dySrc: i32,  // INT
        dwRate: u32,  // DWORD
        dwScale: u32  // DWORD
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("MSVFW32.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint ICDrawBegin(IntPtr hic, uint dwFlags, IntPtr hpal, IntPtr hwnd, IntPtr hdc, int xDst, int yDst, int dxDst, int dyDst, IntPtr lpbi, int xSrc, int ySrc, int dxSrc, int dySrc, uint dwRate, uint dwScale);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MSVFW32_ICDrawBegin' -Namespace Win32 -PassThru
# $api::ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale)
#uselib "MSVFW32.dll"
#func global ICDrawBegin "ICDrawBegin" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; ICDrawBegin hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, varptr(lpbi), xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale   ; 戻り値は stat
; hic : HIC -> "sptr"
; dwFlags : DWORD -> "sptr"
; hpal : HPALETTE optional -> "sptr"
; hwnd : HWND optional -> "sptr"
; hdc : HDC optional -> "sptr"
; xDst : INT -> "sptr"
; yDst : INT -> "sptr"
; dxDst : INT -> "sptr"
; dyDst : INT -> "sptr"
; lpbi : BITMAPINFOHEADER* -> "sptr"
; xSrc : INT -> "sptr"
; ySrc : INT -> "sptr"
; dxSrc : INT -> "sptr"
; dySrc : INT -> "sptr"
; dwRate : DWORD -> "sptr"
; dwScale : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "MSVFW32.dll"
#cfunc global ICDrawBegin "ICDrawBegin" sptr, int, sptr, sptr, sptr, int, int, int, int, var, int, int, int, int, int, int
; res = ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale)
; hic : HIC -> "sptr"
; dwFlags : DWORD -> "int"
; hpal : HPALETTE optional -> "sptr"
; hwnd : HWND optional -> "sptr"
; hdc : HDC optional -> "sptr"
; xDst : INT -> "int"
; yDst : INT -> "int"
; dxDst : INT -> "int"
; dyDst : INT -> "int"
; lpbi : BITMAPINFOHEADER* -> "var"
; xSrc : INT -> "int"
; ySrc : INT -> "int"
; dxSrc : INT -> "int"
; dySrc : INT -> "int"
; dwRate : DWORD -> "int"
; dwScale : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD ICDrawBegin(HIC hic, DWORD dwFlags, HPALETTE hpal, HWND hwnd, HDC hdc, INT xDst, INT yDst, INT dxDst, INT dyDst, BITMAPINFOHEADER* lpbi, INT xSrc, INT ySrc, INT dxSrc, INT dySrc, DWORD dwRate, DWORD dwScale)
#uselib "MSVFW32.dll"
#cfunc global ICDrawBegin "ICDrawBegin" intptr, int, intptr, intptr, intptr, int, int, int, int, var, int, int, int, int, int, int
; res = ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale)
; hic : HIC -> "intptr"
; dwFlags : DWORD -> "int"
; hpal : HPALETTE optional -> "intptr"
; hwnd : HWND optional -> "intptr"
; hdc : HDC optional -> "intptr"
; xDst : INT -> "int"
; yDst : INT -> "int"
; dxDst : INT -> "int"
; dyDst : INT -> "int"
; lpbi : BITMAPINFOHEADER* -> "var"
; xSrc : INT -> "int"
; ySrc : INT -> "int"
; dxSrc : INT -> "int"
; dySrc : INT -> "int"
; dwRate : DWORD -> "int"
; dwScale : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	msvfw32 = windows.NewLazySystemDLL("MSVFW32.dll")
	procICDrawBegin = msvfw32.NewProc("ICDrawBegin")
)

// hic (HIC), dwFlags (DWORD), hpal (HPALETTE optional), hwnd (HWND optional), hdc (HDC optional), xDst (INT), yDst (INT), dxDst (INT), dyDst (INT), lpbi (BITMAPINFOHEADER*), xSrc (INT), ySrc (INT), dxSrc (INT), dySrc (INT), dwRate (DWORD), dwScale (DWORD)
r1, _, err := procICDrawBegin.Call(
	uintptr(hic),
	uintptr(dwFlags),
	uintptr(hpal),
	uintptr(hwnd),
	uintptr(hdc),
	uintptr(xDst),
	uintptr(yDst),
	uintptr(dxDst),
	uintptr(dyDst),
	uintptr(lpbi),
	uintptr(xSrc),
	uintptr(ySrc),
	uintptr(dxSrc),
	uintptr(dySrc),
	uintptr(dwRate),
	uintptr(dwScale),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function ICDrawBegin(
  hic: THandle;   // HIC
  dwFlags: DWORD;   // DWORD
  hpal: THandle;   // HPALETTE optional
  hwnd: THandle;   // HWND optional
  hdc: THandle;   // HDC optional
  xDst: Integer;   // INT
  yDst: Integer;   // INT
  dxDst: Integer;   // INT
  dyDst: Integer;   // INT
  lpbi: Pointer;   // BITMAPINFOHEADER*
  xSrc: Integer;   // INT
  ySrc: Integer;   // INT
  dxSrc: Integer;   // INT
  dySrc: Integer;   // INT
  dwRate: DWORD;   // DWORD
  dwScale: DWORD   // DWORD
): DWORD; cdecl;
  external 'MSVFW32.dll' name 'ICDrawBegin';
result := DllCall("MSVFW32\ICDrawBegin"
    , "Ptr", hic   ; HIC
    , "UInt", dwFlags   ; DWORD
    , "Ptr", hpal   ; HPALETTE optional
    , "Ptr", hwnd   ; HWND optional
    , "Ptr", hdc   ; HDC optional
    , "Int", xDst   ; INT
    , "Int", yDst   ; INT
    , "Int", dxDst   ; INT
    , "Int", dyDst   ; INT
    , "Ptr", lpbi   ; BITMAPINFOHEADER*
    , "Int", xSrc   ; INT
    , "Int", ySrc   ; INT
    , "Int", dxSrc   ; INT
    , "Int", dySrc   ; INT
    , "UInt", dwRate   ; DWORD
    , "UInt", dwScale   ; DWORD
    , "Cdecl UInt")   ; return: DWORD
●ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale) = DLL("MSVFW32.dll", "dword ICDrawBegin(void*, dword, void*, void*, void*, int, int, int, int, void*, int, int, int, int, dword, dword)")
# 呼び出し: ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale)
# hic : HIC -> "void*"
# dwFlags : DWORD -> "dword"
# hpal : HPALETTE optional -> "void*"
# hwnd : HWND optional -> "void*"
# hdc : HDC optional -> "void*"
# xDst : INT -> "int"
# yDst : INT -> "int"
# dxDst : INT -> "int"
# dyDst : INT -> "int"
# lpbi : BITMAPINFOHEADER* -> "void*"
# xSrc : INT -> "int"
# ySrc : INT -> "int"
# dxSrc : INT -> "int"
# dySrc : INT -> "int"
# dwRate : DWORD -> "dword"
# dwScale : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※cdecl関数。DLL()宣言はstdcall前提。cdeclは EXEC_PTR(`cdecl`,…) を使用。
const std = @import("std");

extern "msvfw32" fn ICDrawBegin(
    hic: ?*anyopaque, // HIC
    dwFlags: u32, // DWORD
    hpal: ?*anyopaque, // HPALETTE optional
    hwnd: ?*anyopaque, // HWND optional
    hdc: ?*anyopaque, // HDC optional
    xDst: i32, // INT
    yDst: i32, // INT
    dxDst: i32, // INT
    dyDst: i32, // INT
    lpbi: [*c]BITMAPINFOHEADER, // BITMAPINFOHEADER*
    xSrc: i32, // INT
    ySrc: i32, // INT
    dxSrc: i32, // INT
    dySrc: i32, // INT
    dwRate: u32, // DWORD
    dwScale: u32 // DWORD
) callconv(.c) u32;
proc ICDrawBegin(
    hic: pointer,  # HIC
    dwFlags: uint32,  # DWORD
    hpal: pointer,  # HPALETTE optional
    hwnd: pointer,  # HWND optional
    hdc: pointer,  # HDC optional
    xDst: int32,  # INT
    yDst: int32,  # INT
    dxDst: int32,  # INT
    dyDst: int32,  # INT
    lpbi: ptr BITMAPINFOHEADER,  # BITMAPINFOHEADER*
    xSrc: int32,  # INT
    ySrc: int32,  # INT
    dxSrc: int32,  # INT
    dySrc: int32,  # INT
    dwRate: uint32,  # DWORD
    dwScale: uint32  # DWORD
): uint32 {.importc: "ICDrawBegin", cdecl, dynlib: "MSVFW32.dll".}
pragma(lib, "msvfw32");
extern(C)
uint ICDrawBegin(
    void* hic,   // HIC
    uint dwFlags,   // DWORD
    void* hpal,   // HPALETTE optional
    void* hwnd,   // HWND optional
    void* hdc,   // HDC optional
    int xDst,   // INT
    int yDst,   // INT
    int dxDst,   // INT
    int dyDst,   // INT
    BITMAPINFOHEADER* lpbi,   // BITMAPINFOHEADER*
    int xSrc,   // INT
    int ySrc,   // INT
    int dxSrc,   // INT
    int dySrc,   // INT
    uint dwRate,   // DWORD
    uint dwScale   // DWORD
);
ccall((:ICDrawBegin, "MSVFW32.dll"), UInt32,
      (Ptr{Cvoid}, UInt32, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Int32, Int32, Int32, Int32, Ptr{BITMAPINFOHEADER}, Int32, Int32, Int32, Int32, UInt32, UInt32),
      hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale)
# hic : HIC -> Ptr{Cvoid}
# dwFlags : DWORD -> UInt32
# hpal : HPALETTE optional -> Ptr{Cvoid}
# hwnd : HWND optional -> Ptr{Cvoid}
# hdc : HDC optional -> Ptr{Cvoid}
# xDst : INT -> Int32
# yDst : INT -> Int32
# dxDst : INT -> Int32
# dyDst : INT -> Int32
# lpbi : BITMAPINFOHEADER* -> Ptr{BITMAPINFOHEADER}
# xSrc : INT -> Int32
# ySrc : INT -> Int32
# dxSrc : INT -> Int32
# dySrc : INT -> Int32
# dwRate : DWORD -> UInt32
# dwScale : DWORD -> UInt32
local ffi = require("ffi")
ffi.cdef[[
uint32_t ICDrawBegin(
    void* hic,
    uint32_t dwFlags,
    void* hpal,
    void* hwnd,
    void* hdc,
    int32_t xDst,
    int32_t yDst,
    int32_t dxDst,
    int32_t dyDst,
    void* lpbi,
    int32_t xSrc,
    int32_t ySrc,
    int32_t dxSrc,
    int32_t dySrc,
    uint32_t dwRate,
    uint32_t dwScale);
]]
local msvfw32 = ffi.load("msvfw32")
-- msvfw32.ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale)
-- hic : HIC
-- dwFlags : DWORD
-- hpal : HPALETTE optional
-- hwnd : HWND optional
-- hdc : HDC optional
-- xDst : INT
-- yDst : INT
-- dxDst : INT
-- dyDst : INT
-- lpbi : BITMAPINFOHEADER*
-- xSrc : INT
-- ySrc : INT
-- dxSrc : INT
-- dySrc : INT
-- dwRate : DWORD
-- dwScale : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('MSVFW32.dll');
const ICDrawBegin = lib.func('__cdecl', 'ICDrawBegin', 'uint32_t', ['void *', 'uint32_t', 'void *', 'void *', 'void *', 'int32_t', 'int32_t', 'int32_t', 'int32_t', 'void *', 'int32_t', 'int32_t', 'int32_t', 'int32_t', 'uint32_t', 'uint32_t']);
// ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale)
// hic : HIC -> 'void *'
// dwFlags : DWORD -> 'uint32_t'
// hpal : HPALETTE optional -> 'void *'
// hwnd : HWND optional -> 'void *'
// hdc : HDC optional -> 'void *'
// xDst : INT -> 'int32_t'
// yDst : INT -> 'int32_t'
// dxDst : INT -> 'int32_t'
// dyDst : INT -> 'int32_t'
// lpbi : BITMAPINFOHEADER* -> 'void *'
// xSrc : INT -> 'int32_t'
// ySrc : INT -> 'int32_t'
// dxSrc : INT -> 'int32_t'
// dySrc : INT -> 'int32_t'
// dwRate : DWORD -> 'uint32_t'
// dwScale : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("MSVFW32.dll", {
  ICDrawBegin: { parameters: ["pointer", "u32", "pointer", "pointer", "pointer", "i32", "i32", "i32", "i32", "pointer", "i32", "i32", "i32", "i32", "u32", "u32"], result: "u32" },
});
// lib.symbols.ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale)
// hic : HIC -> "pointer"
// dwFlags : DWORD -> "u32"
// hpal : HPALETTE optional -> "pointer"
// hwnd : HWND optional -> "pointer"
// hdc : HDC optional -> "pointer"
// xDst : INT -> "i32"
// yDst : INT -> "i32"
// dxDst : INT -> "i32"
// dyDst : INT -> "i32"
// lpbi : BITMAPINFOHEADER* -> "pointer"
// xSrc : INT -> "i32"
// ySrc : INT -> "i32"
// dxSrc : INT -> "i32"
// dySrc : INT -> "i32"
// dwRate : DWORD -> "u32"
// dwScale : DWORD -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t ICDrawBegin(
    void* hic,
    uint32_t dwFlags,
    void* hpal,
    void* hwnd,
    void* hdc,
    int32_t xDst,
    int32_t yDst,
    int32_t dxDst,
    int32_t dyDst,
    void* lpbi,
    int32_t xSrc,
    int32_t ySrc,
    int32_t dxSrc,
    int32_t dySrc,
    uint32_t dwRate,
    uint32_t dwScale);
C, "MSVFW32.dll");
// $ffi->ICDrawBegin(hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale);
// hic : HIC
// dwFlags : DWORD
// hpal : HPALETTE optional
// hwnd : HWND optional
// hdc : HDC optional
// xDst : INT
// yDst : INT
// dxDst : INT
// dyDst : INT
// lpbi : BITMAPINFOHEADER*
// xSrc : INT
// ySrc : INT
// dxSrc : INT
// dySrc : INT
// dwRate : DWORD
// dwScale : DWORD
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Msvfw32 extends Library {
    Msvfw32 INSTANCE = Native.load("msvfw32", Msvfw32.class);
    int ICDrawBegin(
        Pointer hic,   // HIC
        int dwFlags,   // DWORD
        Pointer hpal,   // HPALETTE optional
        Pointer hwnd,   // HWND optional
        Pointer hdc,   // HDC optional
        int xDst,   // INT
        int yDst,   // INT
        int dxDst,   // INT
        int dyDst,   // INT
        Pointer lpbi,   // BITMAPINFOHEADER*
        int xSrc,   // INT
        int ySrc,   // INT
        int dxSrc,   // INT
        int dySrc,   // INT
        int dwRate,   // DWORD
        int dwScale   // DWORD
    );
}
@[Link("msvfw32")]
lib LibMSVFW32
  fun ICDrawBegin = ICDrawBegin(
    hic : Void*,   # HIC
    dwFlags : UInt32,   # DWORD
    hpal : Void*,   # HPALETTE optional
    hwnd : Void*,   # HWND optional
    hdc : Void*,   # HDC optional
    xDst : Int32,   # INT
    yDst : Int32,   # INT
    dxDst : Int32,   # INT
    dyDst : Int32,   # INT
    lpbi : BITMAPINFOHEADER*,   # BITMAPINFOHEADER*
    xSrc : Int32,   # INT
    ySrc : Int32,   # INT
    dxSrc : Int32,   # INT
    dySrc : Int32,   # INT
    dwRate : UInt32,   # DWORD
    dwScale : UInt32   # DWORD
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef ICDrawBeginNative = Uint32 Function(Pointer<Void>, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Void>, Int32, Int32, Int32, Int32, Pointer<Void>, Int32, Int32, Int32, Int32, Uint32, Uint32);
typedef ICDrawBeginDart = int Function(Pointer<Void>, int, Pointer<Void>, Pointer<Void>, Pointer<Void>, int, int, int, int, Pointer<Void>, int, int, int, int, int, int);
final ICDrawBegin = DynamicLibrary.open('MSVFW32.dll')
    .lookupFunction<ICDrawBeginNative, ICDrawBeginDart>('ICDrawBegin');
// hic : HIC -> Pointer<Void>
// dwFlags : DWORD -> Uint32
// hpal : HPALETTE optional -> Pointer<Void>
// hwnd : HWND optional -> Pointer<Void>
// hdc : HDC optional -> Pointer<Void>
// xDst : INT -> Int32
// yDst : INT -> Int32
// dxDst : INT -> Int32
// dyDst : INT -> Int32
// lpbi : BITMAPINFOHEADER* -> Pointer<Void>
// xSrc : INT -> Int32
// ySrc : INT -> Int32
// dxSrc : INT -> Int32
// dySrc : INT -> Int32
// dwRate : DWORD -> Uint32
// dwScale : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function ICDrawBegin(
  hic: THandle;   // HIC
  dwFlags: DWORD;   // DWORD
  hpal: THandle;   // HPALETTE optional
  hwnd: THandle;   // HWND optional
  hdc: THandle;   // HDC optional
  xDst: Integer;   // INT
  yDst: Integer;   // INT
  dxDst: Integer;   // INT
  dyDst: Integer;   // INT
  lpbi: Pointer;   // BITMAPINFOHEADER*
  xSrc: Integer;   // INT
  ySrc: Integer;   // INT
  dxSrc: Integer;   // INT
  dySrc: Integer;   // INT
  dwRate: DWORD;   // DWORD
  dwScale: DWORD   // DWORD
): DWORD; cdecl;
  external 'MSVFW32.dll' name 'ICDrawBegin';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import ccall safe "ICDrawBegin"
  c_ICDrawBegin :: Ptr () -> Word32 -> Ptr () -> Ptr () -> Ptr () -> Int32 -> Int32 -> Int32 -> Int32 -> Ptr () -> Int32 -> Int32 -> Int32 -> Int32 -> Word32 -> Word32 -> IO Word32
-- hic : HIC -> Ptr ()
-- dwFlags : DWORD -> Word32
-- hpal : HPALETTE optional -> Ptr ()
-- hwnd : HWND optional -> Ptr ()
-- hdc : HDC optional -> Ptr ()
-- xDst : INT -> Int32
-- yDst : INT -> Int32
-- dxDst : INT -> Int32
-- dyDst : INT -> Int32
-- lpbi : BITMAPINFOHEADER* -> Ptr ()
-- xSrc : INT -> Int32
-- ySrc : INT -> Int32
-- dxSrc : INT -> Int32
-- dySrc : INT -> Int32
-- dwRate : DWORD -> Word32
-- dwScale : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let icdrawbegin =
  foreign "ICDrawBegin"
    ((ptr void) @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> int32_t @-> int32_t @-> int32_t @-> int32_t @-> (ptr void) @-> int32_t @-> int32_t @-> int32_t @-> int32_t @-> uint32_t @-> uint32_t @-> returning uint32_t)
(* hic : HIC -> (ptr void) *)
(* dwFlags : DWORD -> uint32_t *)
(* hpal : HPALETTE optional -> (ptr void) *)
(* hwnd : HWND optional -> (ptr void) *)
(* hdc : HDC optional -> (ptr void) *)
(* xDst : INT -> int32_t *)
(* yDst : INT -> int32_t *)
(* dxDst : INT -> int32_t *)
(* dyDst : INT -> int32_t *)
(* lpbi : BITMAPINFOHEADER* -> (ptr void) *)
(* xSrc : INT -> int32_t *)
(* ySrc : INT -> int32_t *)
(* dxSrc : INT -> int32_t *)
(* dySrc : INT -> int32_t *)
(* dwRate : DWORD -> uint32_t *)
(* dwScale : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library msvfw32 (t "MSVFW32.dll"))
(cffi:use-foreign-library msvfw32)

(cffi:defcfun ("ICDrawBegin" icdraw-begin :convention :cdecl) :uint32
  (hic :pointer)   ; HIC
  (dw-flags :uint32)   ; DWORD
  (hpal :pointer)   ; HPALETTE optional
  (hwnd :pointer)   ; HWND optional
  (hdc :pointer)   ; HDC optional
  (x-dst :int32)   ; INT
  (y-dst :int32)   ; INT
  (dx-dst :int32)   ; INT
  (dy-dst :int32)   ; INT
  (lpbi :pointer)   ; BITMAPINFOHEADER*
  (x-src :int32)   ; INT
  (y-src :int32)   ; INT
  (dx-src :int32)   ; INT
  (dy-src :int32)   ; INT
  (dw-rate :uint32)   ; DWORD
  (dw-scale :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $ICDrawBegin = Win32::API::More->new('MSVFW32',
    'DWORD ICDrawBegin(HANDLE hic, DWORD dwFlags, HANDLE hpal, HANDLE hwnd, HANDLE hdc, int xDst, int yDst, int dxDst, int dyDst, LPVOID lpbi, int xSrc, int ySrc, int dxSrc, int dySrc, DWORD dwRate, DWORD dwScale)');
# my $ret = $ICDrawBegin->Call($hic, $dwFlags, $hpal, $hwnd, $hdc, $xDst, $yDst, $dxDst, $dyDst, $lpbi, $xSrc, $ySrc, $dxSrc, $dySrc, $dwRate, $dwScale);
# hic : HIC -> HANDLE
# dwFlags : DWORD -> DWORD
# hpal : HPALETTE optional -> HANDLE
# hwnd : HWND optional -> HANDLE
# hdc : HDC optional -> HANDLE
# xDst : INT -> int
# yDst : INT -> int
# dxDst : INT -> int
# dyDst : INT -> int
# lpbi : BITMAPINFOHEADER* -> LPVOID
# xSrc : INT -> int
# ySrc : INT -> int
# dxSrc : INT -> int
# dySrc : INT -> int
# dwRate : DWORD -> DWORD
# dwScale : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

使用する型