Win32 API 日本語リファレンス
ホームUI.WindowsAndMessaging › LoadImageA

LoadImageA

関数
アイコン・カーソル・ビットマップを読み込む(ANSI版)。
DLLUSER32.dll文字セットANSI (-A)呼出規約winapiSetLastErrorあり対応OSWindows 2000 以降

シグネチャ

// USER32.dll  (ANSI / -A)
#include <windows.h>

HANDLE LoadImageA(
    HINSTANCE hInst,   // optional
    LPCSTR name,
    GDI_IMAGE_TYPE type,
    INT cx,
    INT cy,
    IMAGE_FLAGS fuLoad
);

パラメーター

名前方向説明
hInstHINSTANCEinoptional

読み込む画像を含む DLL または実行可能ファイル (.exe) のモジュールへのハンドルです。詳細については、GetModuleHandle を参照してください。なお、32 ビット版 Windows 以降では、WinMain のシステム関数呼び出しで公開されるアプリケーションインスタンスハンドルのようなインスタンスハンドル (HINSTANCE) と、モジュールハンドル (HMODULE) は同一のものです。

定義済みの画像、または独立したリソース (アイコン、カーソル、ビットマップのファイル) を読み込むには、このパラメーターを NULL に設定します。

nameLPCSTRin

読み込む画像です。

hInst パラメーターが NULL 以外で、かつ fuLoad パラメーターに LR_LOADFROMFILE が含まれていない場合、namehInst モジュール内の画像リソースを指定します。

モジュールから名前で画像リソースを読み込む場合、name パラメーターは画像リソースの名前を含む null 終端文字列へのポインターです。

モジュールから序数で画像リソースを読み込む場合は、MAKEINTRESOURCE マクロを使用して、画像の序数を LoadImage 関数に渡せる形式に変換します。

hInst パラメーターが NULL で、fuLoad パラメーターに LR_LOADFROMFILE 値が含まれず LR_SHARED が含まれる場合、name は読み込む定義済みの画像を指定します。

定義済みの画像識別子は Winuser.h で定義されており、次のプレフィックスを持ちます。

プレフィックス 意味
OBM_ OEM ビットマップ。MAKEINTRESOURCE マクロを使用して渡します。
OIC_ OEM アイコン。MAKEINTRESOURCE マクロを使用して渡します。
OCR_ OEM カーソル。MAKEINTRESOURCE マクロを使用して渡します。
IDI_ 標準アイコン
IDC_ 標準カーソル

OEM 画像識別子の定数を LoadImage 関数に渡すには、MAKEINTRESOURCE マクロを使用します。たとえば OCR_NORMAL カーソルを読み込むには、name パラメーターに MAKEINTRESOURCE(OCR_NORMAL) を、hInst パラメーターに NULL を、fuLoad パラメーターのフラグの 1 つに LR_SHARED を渡します。

hInst パラメーターが NULL で、fuLoad パラメーターに LR_LOADFROMFILE 値が含まれる場合、name は独立したリソース (アイコン、カーソル、ビットマップのファイル) を含むファイルの名前です。たとえば c:\myicon.ico のように指定します。

詳細については、後述の「解説」セクションを参照してください。

typeGDI_IMAGE_TYPEin

読み込む画像の種類です。

このパラメーターには次のいずれかの値を指定できます。

意味
IMAGE_BITMAP ビットマップを読み込みます。
IMAGE_CURSOR カーソルを読み込みます。
IMAGE_ICON アイコンを読み込みます。
cxINTinアイコンまたはカーソルの幅 (ピクセル単位) です。このパラメーターが 0 で fuLoad パラメーターが LR_DEFAULTSIZE の場合、関数は SM_CXICON または SM_CXCURSOR のシステムメトリック値を使用して幅を設定します。このパラメーターが 0 で LR_DEFAULTSIZE が使用されていない場合、関数は実際のリソースの幅を使用します。
cyINTinアイコンまたはカーソルの高さ (ピクセル単位) です。このパラメーターが 0 で fuLoad パラメーターが LR_DEFAULTSIZE の場合、関数は SM_CYICON または SM_CYCURSOR のシステムメトリック値を使用して高さを設定します。このパラメーターが 0 で LR_DEFAULTSIZE が使用されていない場合、関数は実際のリソースの高さを使用します。
fuLoadIMAGE_FLAGSin

このパラメーターには次の値を 1 つ以上指定できます。

意味
LR_CREATEDIBSECTION
0x00002000
uType パラメーターに IMAGE_BITMAP を指定した場合、関数は互換ビットマップではなく DIB セクションのビットマップを返します。このフラグは、表示デバイスの色にマッピングせずにビットマップを読み込む際に便利です。
LR_DEFAULTCOLOR
0x00000000
既定のフラグで、何も行いません。「LR_MONOCHROME ではない」という意味のみを持ちます。
LR_DEFAULTSIZE
0x00000040
cx または cy の値が 0 に設定されている場合、カーソルまたはアイコンのシステムメトリック値で指定された幅または高さを使用します。このフラグが指定されておらず、cxcy が 0 に設定されている場合、関数は実際のリソースのサイズを使用します。リソースに複数の画像が含まれる場合、関数は最初の画像のサイズを使用します。
LR_LOADFROMFILE
0x00000010
name で指定されたファイルから独立した画像 (アイコン、カーソル、ビットマップのファイル) を読み込みます。
LR_LOADMAP3DCOLORS
0x00001000
画像のカラーテーブルを検索し、次のグレーの濃淡を対応する 3-D の色に置き換えます。 色深度が 8bpp を超えるビットマップを読み込む場合は、このオプションを使用しないでください。
LR_LOADTRANSPARENT
0x00000020
画像の最初のピクセルの色の値を取得し、カラーテーブル内の対応するエントリを既定のウィンドウ色 (COLOR_WINDOW) に置き換えます。そのエントリを使用する画像内のすべてのピクセルが既定のウィンドウ色になります。この値は、対応するカラーテーブルを持つ画像にのみ適用されます。

色深度が 8bpp を超えるビットマップを読み込む場合は、このオプションを使用しないでください。

fuLoadLR_LOADTRANSPARENTLR_LOADMAP3DCOLORS の両方の値が含まれる場合、LR_LOADTRANSPARENT が優先されます。ただし、カラーテーブルのエントリは COLOR_WINDOW ではなく COLOR_3DFACE に置き換えられます。

LR_MONOCHROME
0x00000001
画像を白黒で読み込みます。
LR_SHARED
0x00008000
画像が複数回読み込まれる場合に、画像ハンドルを共有します。LR_SHARED が設定されていない場合、同じリソースに対して LoadImage を 2 回目に呼び出すと画像が再度読み込まれ、異なるハンドルが返されます。

このフラグを使用すると、リソースが不要になったときにシステムがそれを破棄します。

標準以外のサイズの画像、読み込み後に変更される可能性のある画像、またはファイルから読み込まれる画像には LR_SHARED を使用しないでください。

システムアイコンまたはシステムカーソルを読み込む場合は、LR_SHARED を使用する必要があります。使用しないと関数はリソースの読み込みに失敗します。

この関数は、要求されたサイズに関係なく、要求されたリソース名でキャッシュ内の最初の画像を見つけます。

LR_VGACOLOR
0x00000080
真の VGA カラーを使用します。

戻り値の型: HANDLE

公式ドキュメント

アイコン、カーソル、アニメーションカーソル、またはビットマップを読み込みます。(ANSI)

戻り値

型: HANDLE

関数が成功すると、戻り値は新しく読み込まれた画像のハンドルです。

関数が失敗すると、戻り値は NULL です。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説(Remarks)

IS_INTRESOURCE(name) が TRUE の場合、name は指定されたリソースの整数識別子を指定します。それ以外の場合は null 終端文字列へのポインターです。文字列の最初の文字がシャープ記号 (#) の場合、残りの文字はリソースの整数識別子を指定する 10 進数を表します。たとえば文字列 "#258" は識別子 258 を表します。

LR_SHARED フラグを指定せずに読み込んだビットマップ、カーソル、またはアイコンの使用が終わったら、次の表のいずれかの関数を呼び出して、関連付けられたメモリを解放できます。

リソース 解放関数
ビットマップ DeleteObject
カーソル DestroyCursor
アイコン DestroyIcon

これらのリソースは、それらを作成したプロセスが終了するとシステムによって自動的に削除されます。ただし、適切な関数を呼び出すことでメモリを節約し、プロセスのワーキングセットのサイズを減らすことができます。

例については、ウィンドウクラスの使用を参照してください。

メモ

winuser.h ヘッダーは LoadImage を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義します。エンコード中立のエイリアスの使用を、エンコード中立でないコードと混在させると、コンパイルエラーや実行時エラーを引き起こす不一致につながる可能性があります。詳細については、関数プロトタイプの規則を参照してください。

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

各言語での呼び出し定義

// USER32.dll  (ANSI / -A)
#include <windows.h>

HANDLE LoadImageA(
    HINSTANCE hInst,   // optional
    LPCSTR name,
    GDI_IMAGE_TYPE type,
    INT cx,
    INT cy,
    IMAGE_FLAGS fuLoad
);
[DllImport("USER32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern IntPtr LoadImageA(
    IntPtr hInst,   // HINSTANCE optional
    [MarshalAs(UnmanagedType.LPStr)] string name,   // LPCSTR
    uint type,   // GDI_IMAGE_TYPE
    int cx,   // INT
    int cy,   // INT
    uint fuLoad   // IMAGE_FLAGS
);
<DllImport("USER32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function LoadImageA(
    hInst As IntPtr,   ' HINSTANCE optional
    <MarshalAs(UnmanagedType.LPStr)> name As String,   ' LPCSTR
    type As UInteger,   ' GDI_IMAGE_TYPE
    cx As Integer,   ' INT
    cy As Integer,   ' INT
    fuLoad As UInteger   ' IMAGE_FLAGS
) As IntPtr
End Function
' hInst : HINSTANCE optional
' name : LPCSTR
' type : GDI_IMAGE_TYPE
' cx : INT
' cy : INT
' fuLoad : IMAGE_FLAGS
Declare PtrSafe Function LoadImageA Lib "user32" ( _
    ByVal hInst As LongPtr, _
    ByVal name As String, _
    ByVal type As Long, _
    ByVal cx As Long, _
    ByVal cy As Long, _
    ByVal fuLoad As Long) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

LoadImageA = ctypes.windll.user32.LoadImageA
LoadImageA.restype = ctypes.c_void_p
LoadImageA.argtypes = [
    wintypes.HANDLE,  # hInst : HINSTANCE optional
    wintypes.LPCSTR,  # name : LPCSTR
    wintypes.DWORD,  # type : GDI_IMAGE_TYPE
    ctypes.c_int,  # cx : INT
    ctypes.c_int,  # cy : INT
    wintypes.DWORD,  # fuLoad : IMAGE_FLAGS
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('USER32.dll')
LoadImageA = Fiddle::Function.new(
  lib['LoadImageA'],
  [
    Fiddle::TYPE_VOIDP,  # hInst : HINSTANCE optional
    Fiddle::TYPE_VOIDP,  # name : LPCSTR
    -Fiddle::TYPE_INT,  # type : GDI_IMAGE_TYPE
    Fiddle::TYPE_INT,  # cx : INT
    Fiddle::TYPE_INT,  # cy : INT
    -Fiddle::TYPE_INT,  # fuLoad : IMAGE_FLAGS
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "user32")]
extern "system" {
    fn LoadImageA(
        hInst: *mut core::ffi::c_void,  // HINSTANCE optional
        name: *const u8,  // LPCSTR
        type: u32,  // GDI_IMAGE_TYPE
        cx: i32,  // INT
        cy: i32,  // INT
        fuLoad: u32  // IMAGE_FLAGS
    ) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("USER32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern IntPtr LoadImageA(IntPtr hInst, [MarshalAs(UnmanagedType.LPStr)] string name, uint type, int cx, int cy, uint fuLoad);
"@
$api = Add-Type -MemberDefinition $sig -Name 'USER32_LoadImageA' -Namespace Win32 -PassThru
# $api::LoadImageA(hInst, name, type, cx, cy, fuLoad)
#uselib "USER32.dll"
#func global LoadImageA "LoadImageA" sptr, sptr, sptr, sptr, sptr, sptr
; LoadImageA hInst, name, type, cx, cy, fuLoad   ; 戻り値は stat
; hInst : HINSTANCE optional -> "sptr"
; name : LPCSTR -> "sptr"
; type : GDI_IMAGE_TYPE -> "sptr"
; cx : INT -> "sptr"
; cy : INT -> "sptr"
; fuLoad : IMAGE_FLAGS -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "USER32.dll"
#cfunc global LoadImageA "LoadImageA" sptr, str, int, int, int, int
; res = LoadImageA(hInst, name, type, cx, cy, fuLoad)
; hInst : HINSTANCE optional -> "sptr"
; name : LPCSTR -> "str"
; type : GDI_IMAGE_TYPE -> "int"
; cx : INT -> "int"
; cy : INT -> "int"
; fuLoad : IMAGE_FLAGS -> "int"
; HANDLE LoadImageA(HINSTANCE hInst, LPCSTR name, GDI_IMAGE_TYPE type, INT cx, INT cy, IMAGE_FLAGS fuLoad)
#uselib "USER32.dll"
#cfunc global LoadImageA "LoadImageA" intptr, str, int, int, int, int
; res = LoadImageA(hInst, name, type, cx, cy, fuLoad)
; hInst : HINSTANCE optional -> "intptr"
; name : LPCSTR -> "str"
; type : GDI_IMAGE_TYPE -> "int"
; cx : INT -> "int"
; cy : INT -> "int"
; fuLoad : IMAGE_FLAGS -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	user32 = windows.NewLazySystemDLL("USER32.dll")
	procLoadImageA = user32.NewProc("LoadImageA")
)

// hInst (HINSTANCE optional), name (LPCSTR), type (GDI_IMAGE_TYPE), cx (INT), cy (INT), fuLoad (IMAGE_FLAGS)
r1, _, err := procLoadImageA.Call(
	uintptr(hInst),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(name))),
	uintptr(type),
	uintptr(cx),
	uintptr(cy),
	uintptr(fuLoad),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HANDLE
function LoadImageA(
  hInst: THandle;   // HINSTANCE optional
  name: PAnsiChar;   // LPCSTR
  type: DWORD;   // GDI_IMAGE_TYPE
  cx: Integer;   // INT
  cy: Integer;   // INT
  fuLoad: DWORD   // IMAGE_FLAGS
): THandle; stdcall;
  external 'USER32.dll' name 'LoadImageA';
result := DllCall("USER32\LoadImageA"
    , "Ptr", hInst   ; HINSTANCE optional
    , "AStr", name   ; LPCSTR
    , "UInt", type   ; GDI_IMAGE_TYPE
    , "Int", cx   ; INT
    , "Int", cy   ; INT
    , "UInt", fuLoad   ; IMAGE_FLAGS
    , "Ptr")   ; return: HANDLE
●LoadImageA(hInst, name, type, cx, cy, fuLoad) = DLL("USER32.dll", "void* LoadImageA(void*, char*, dword, int, int, dword)")
# 呼び出し: LoadImageA(hInst, name, type, cx, cy, fuLoad)
# hInst : HINSTANCE optional -> "void*"
# name : LPCSTR -> "char*"
# type : GDI_IMAGE_TYPE -> "dword"
# cx : INT -> "int"
# cy : INT -> "int"
# fuLoad : IMAGE_FLAGS -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "user32" fn LoadImageA(
    hInst: ?*anyopaque, // HINSTANCE optional
    name: [*c]const u8, // LPCSTR
    type: u32, // GDI_IMAGE_TYPE
    cx: i32, // INT
    cy: i32, // INT
    fuLoad: u32 // IMAGE_FLAGS
) callconv(std.os.windows.WINAPI) ?*anyopaque;
proc LoadImageA(
    hInst: pointer,  # HINSTANCE optional
    name: cstring,  # LPCSTR
    `type`: uint32,  # GDI_IMAGE_TYPE
    cx: int32,  # INT
    cy: int32,  # INT
    fuLoad: uint32  # IMAGE_FLAGS
): pointer {.importc: "LoadImageA", stdcall, dynlib: "USER32.dll".}
pragma(lib, "user32");
extern(Windows)
void* LoadImageA(
    void* hInst,   // HINSTANCE optional
    const(char)* name,   // LPCSTR
    uint type,   // GDI_IMAGE_TYPE
    int cx,   // INT
    int cy,   // INT
    uint fuLoad   // IMAGE_FLAGS
);
ccall((:LoadImageA, "USER32.dll"), stdcall, Ptr{Cvoid},
      (Ptr{Cvoid}, Cstring, UInt32, Int32, Int32, UInt32),
      hInst, name, type, cx, cy, fuLoad)
# hInst : HINSTANCE optional -> Ptr{Cvoid}
# name : LPCSTR -> Cstring
# type : GDI_IMAGE_TYPE -> UInt32
# cx : INT -> Int32
# cy : INT -> Int32
# fuLoad : IMAGE_FLAGS -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* LoadImageA(
    void* hInst,
    const char* name,
    uint32_t type,
    int32_t cx,
    int32_t cy,
    uint32_t fuLoad);
]]
local user32 = ffi.load("user32")
-- user32.LoadImageA(hInst, name, type, cx, cy, fuLoad)
-- hInst : HINSTANCE optional
-- name : LPCSTR
-- type : GDI_IMAGE_TYPE
-- cx : INT
-- cy : INT
-- fuLoad : IMAGE_FLAGS
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('USER32.dll');
const LoadImageA = lib.func('__stdcall', 'LoadImageA', 'void *', ['void *', 'str', 'uint32_t', 'int32_t', 'int32_t', 'uint32_t']);
// LoadImageA(hInst, name, type, cx, cy, fuLoad)
// hInst : HINSTANCE optional -> 'void *'
// name : LPCSTR -> 'str'
// type : GDI_IMAGE_TYPE -> 'uint32_t'
// cx : INT -> 'int32_t'
// cy : INT -> 'int32_t'
// fuLoad : IMAGE_FLAGS -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("USER32.dll", {
  LoadImageA: { parameters: ["pointer", "buffer", "u32", "i32", "i32", "u32"], result: "pointer" },
});
// lib.symbols.LoadImageA(hInst, name, type, cx, cy, fuLoad)
// hInst : HINSTANCE optional -> "pointer"
// name : LPCSTR -> "buffer"
// type : GDI_IMAGE_TYPE -> "u32"
// cx : INT -> "i32"
// cy : INT -> "i32"
// fuLoad : IMAGE_FLAGS -> "u32"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* LoadImageA(
    void* hInst,
    const char* name,
    uint32_t type,
    int32_t cx,
    int32_t cy,
    uint32_t fuLoad);
C, "USER32.dll");
// $ffi->LoadImageA(hInst, name, type, cx, cy, fuLoad);
// hInst : HINSTANCE optional
// name : LPCSTR
// type : GDI_IMAGE_TYPE
// cx : INT
// cy : INT
// fuLoad : IMAGE_FLAGS
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface User32 extends StdCallLibrary {
    User32 INSTANCE = Native.load("user32", User32.class, W32APIOptions.ASCII_OPTIONS);
    Pointer LoadImageA(
        Pointer hInst,   // HINSTANCE optional
        String name,   // LPCSTR
        int type,   // GDI_IMAGE_TYPE
        int cx,   // INT
        int cy,   // INT
        int fuLoad   // IMAGE_FLAGS
    );
}
@[Link("user32")]
lib LibUSER32
  fun LoadImageA = LoadImageA(
    hInst : Void*,   # HINSTANCE optional
    name : UInt8*,   # LPCSTR
    type_ : UInt32,   # GDI_IMAGE_TYPE
    cx : Int32,   # INT
    cy : Int32,   # INT
    fuLoad : UInt32   # IMAGE_FLAGS
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef LoadImageANative = Pointer<Void> Function(Pointer<Void>, Pointer<Utf8>, Uint32, Int32, Int32, Uint32);
typedef LoadImageADart = Pointer<Void> Function(Pointer<Void>, Pointer<Utf8>, int, int, int, int);
final LoadImageA = DynamicLibrary.open('USER32.dll')
    .lookupFunction<LoadImageANative, LoadImageADart>('LoadImageA');
// hInst : HINSTANCE optional -> Pointer<Void>
// name : LPCSTR -> Pointer<Utf8>
// type : GDI_IMAGE_TYPE -> Uint32
// cx : INT -> Int32
// cy : INT -> Int32
// fuLoad : IMAGE_FLAGS -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function LoadImageA(
  hInst: THandle;   // HINSTANCE optional
  name: PAnsiChar;   // LPCSTR
  type: DWORD;   // GDI_IMAGE_TYPE
  cx: Integer;   // INT
  cy: Integer;   // INT
  fuLoad: DWORD   // IMAGE_FLAGS
): THandle; stdcall;
  external 'USER32.dll' name 'LoadImageA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "LoadImageA"
  c_LoadImageA :: Ptr () -> CString -> Word32 -> Int32 -> Int32 -> Word32 -> IO (Ptr ())
-- hInst : HINSTANCE optional -> Ptr ()
-- name : LPCSTR -> CString
-- type : GDI_IMAGE_TYPE -> Word32
-- cx : INT -> Int32
-- cy : INT -> Int32
-- fuLoad : IMAGE_FLAGS -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let loadimagea =
  foreign "LoadImageA"
    ((ptr void) @-> string @-> uint32_t @-> int32_t @-> int32_t @-> uint32_t @-> returning (ptr void))
(* hInst : HINSTANCE optional -> (ptr void) *)
(* name : LPCSTR -> string *)
(* type : GDI_IMAGE_TYPE -> uint32_t *)
(* cx : INT -> int32_t *)
(* cy : INT -> int32_t *)
(* fuLoad : IMAGE_FLAGS -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library user32 (t "USER32.dll"))
(cffi:use-foreign-library user32)

(cffi:defcfun ("LoadImageA" load-image-a :convention :stdcall) :pointer
  (h-inst :pointer)   ; HINSTANCE optional
  (name :string)   ; LPCSTR
  (type :uint32)   ; GDI_IMAGE_TYPE
  (cx :int32)   ; INT
  (cy :int32)   ; INT
  (fu-load :uint32))   ; IMAGE_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $LoadImageA = Win32::API::More->new('USER32',
    'HANDLE LoadImageA(HANDLE hInst, LPCSTR name, DWORD type, int cx, int cy, DWORD fuLoad)');
# my $ret = $LoadImageA->Call($hInst, $name, $type, $cx, $cy, $fuLoad);
# hInst : HINSTANCE optional -> HANDLE
# name : LPCSTR -> LPCSTR
# type : GDI_IMAGE_TYPE -> DWORD
# cx : INT -> int
# cy : INT -> int
# fuLoad : IMAGE_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い
公式の関連項目
使用する型