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

SHGetImageList

関数
システムイメージリストのインターフェイスを取得する。
DLLSHELL32.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

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

HRESULT SHGetImageList(
    INT iImageList,
    const GUID* riid,
    void** ppvObj
);

パラメーター

名前方向説明
iImageListINTin

リストに含まれるイメージの種類です。次のいずれかの値を指定します。

SHIL_LARGE (0x0)

0x0。イメージのサイズは通常 32x32 ピクセルです。ただし、画面のプロパティデザインタブにある効果セクションで大きいアイコンを使用するオプションが選択されている場合は、48x48 ピクセルになります。

SHIL_SMALL (0x1)

0x1。これらのイメージは、Shell の標準的な小アイコンサイズである 16x16 ですが、ユーザーがサイズをカスタマイズできます。

SHIL_EXTRALARGE (0x2)

0x2。これらのイメージは、Shell の標準的な特大アイコンサイズです。通常は 48x48 ですが、ユーザーがサイズをカスタマイズできます。

SHIL_SYSSMALL (0x3)

0x3。これらのイメージは、SM_CXSMICON を指定して呼び出した GetSystemMetrics および SM_CYSMICON を指定して呼び出した GetSystemMetrics で指定されるサイズになります。

SHIL_JUMBO (0x4)

0x4。Windows Vista 以降。イメージのサイズは通常 256x256 ピクセルです。

SHIL_LAST

検証用の、有効な最大のフラグ値です。

riidGUID*inイメージリストインターフェイスの識別子への参照です。通常は IID_IImageList を指定します。
ppvObjvoid**outこのメソッドが返るときに、riid で要求されたインターフェイスポインターが格納されます。通常は IImageList です。

戻り値の型: HRESULT

公式ドキュメント

イメージリストを取得します。

戻り値

型: HRESULT

この関数が成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

ppv パラメーターで返されるような IImageList ポインター型は、必要に応じて HIMAGELIST としてキャストできます。たとえば、リストビューで使用する場合などです。逆に、HIMAGELISTIImageList へのポインターとしてキャストできます。

Windows Vista 以降では、プロセスが dpi 対応としてマークされている場合、SHIL_SMALLSHIL_LARGESHIL_EXTRALARGE は dots per inch (dpi) に応じてスケーリングされます。これらの種類を dpi 対応にするには、SetProcessDPIAware を呼び出します。SHIL_JUMBO は dpi 対応の設定にかかわらず 256 ピクセルに固定されます。

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

各言語での呼び出し定義

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

HRESULT SHGetImageList(
    INT iImageList,
    const GUID* riid,
    void** ppvObj
);
[DllImport("SHELL32.dll", ExactSpelling = true)]
static extern int SHGetImageList(
    int iImageList,   // INT
    ref Guid riid,   // GUID*
    IntPtr ppvObj   // void** out
);
<DllImport("SHELL32.dll", ExactSpelling:=True)>
Public Shared Function SHGetImageList(
    iImageList As Integer,   ' INT
    ByRef riid As Guid,   ' GUID*
    ppvObj As IntPtr   ' void** out
) As Integer
End Function
' iImageList : INT
' riid : GUID*
' ppvObj : void** out
Declare PtrSafe Function SHGetImageList Lib "shell32" ( _
    ByVal iImageList As Long, _
    ByVal riid As LongPtr, _
    ByVal ppvObj As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SHGetImageList = ctypes.windll.shell32.SHGetImageList
SHGetImageList.restype = ctypes.c_int
SHGetImageList.argtypes = [
    ctypes.c_int,  # iImageList : INT
    ctypes.c_void_p,  # riid : GUID*
    ctypes.c_void_p,  # ppvObj : void** out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('SHELL32.dll')
SHGetImageList = Fiddle::Function.new(
  lib['SHGetImageList'],
  [
    Fiddle::TYPE_INT,  # iImageList : INT
    Fiddle::TYPE_VOIDP,  # riid : GUID*
    Fiddle::TYPE_VOIDP,  # ppvObj : void** out
  ],
  Fiddle::TYPE_INT)
#[link(name = "shell32")]
extern "system" {
    fn SHGetImageList(
        iImageList: i32,  // INT
        riid: *const GUID,  // GUID*
        ppvObj: *mut *mut ()  // void** out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("SHELL32.dll")]
public static extern int SHGetImageList(int iImageList, ref Guid riid, IntPtr ppvObj);
"@
$api = Add-Type -MemberDefinition $sig -Name 'SHELL32_SHGetImageList' -Namespace Win32 -PassThru
# $api::SHGetImageList(iImageList, riid, ppvObj)
#uselib "SHELL32.dll"
#func global SHGetImageList "SHGetImageList" sptr, sptr, sptr
; SHGetImageList iImageList, varptr(riid), ppvObj   ; 戻り値は stat
; iImageList : INT -> "sptr"
; riid : GUID* -> "sptr"
; ppvObj : void** out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "SHELL32.dll"
#cfunc global SHGetImageList "SHGetImageList" int, var, sptr
; res = SHGetImageList(iImageList, riid, ppvObj)
; iImageList : INT -> "int"
; riid : GUID* -> "var"
; ppvObj : void** out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HRESULT SHGetImageList(INT iImageList, GUID* riid, void** ppvObj)
#uselib "SHELL32.dll"
#cfunc global SHGetImageList "SHGetImageList" int, var, intptr
; res = SHGetImageList(iImageList, riid, ppvObj)
; iImageList : INT -> "int"
; riid : GUID* -> "var"
; ppvObj : void** out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	shell32 = windows.NewLazySystemDLL("SHELL32.dll")
	procSHGetImageList = shell32.NewProc("SHGetImageList")
)

// iImageList (INT), riid (GUID*), ppvObj (void** out)
r1, _, err := procSHGetImageList.Call(
	uintptr(iImageList),
	uintptr(riid),
	uintptr(ppvObj),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function SHGetImageList(
  iImageList: Integer;   // INT
  riid: PGUID;   // GUID*
  ppvObj: Pointer   // void** out
): Integer; stdcall;
  external 'SHELL32.dll' name 'SHGetImageList';
result := DllCall("SHELL32\SHGetImageList"
    , "Int", iImageList   ; INT
    , "Ptr", riid   ; GUID*
    , "Ptr", ppvObj   ; void** out
    , "Int")   ; return: HRESULT
●SHGetImageList(iImageList, riid, ppvObj) = DLL("SHELL32.dll", "int SHGetImageList(int, void*, void*)")
# 呼び出し: SHGetImageList(iImageList, riid, ppvObj)
# iImageList : INT -> "int"
# riid : GUID* -> "void*"
# ppvObj : void** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "shell32" fn SHGetImageList(
    iImageList: i32, // INT
    riid: [*c]GUID, // GUID*
    ppvObj: ?*anyopaque // void** out
) callconv(std.os.windows.WINAPI) i32;
proc SHGetImageList(
    iImageList: int32,  # INT
    riid: ptr GUID,  # GUID*
    ppvObj: pointer  # void** out
): int32 {.importc: "SHGetImageList", stdcall, dynlib: "SHELL32.dll".}
pragma(lib, "shell32");
extern(Windows)
int SHGetImageList(
    int iImageList,   // INT
    GUID* riid,   // GUID*
    void** ppvObj   // void** out
);
ccall((:SHGetImageList, "SHELL32.dll"), stdcall, Int32,
      (Int32, Ptr{GUID}, Ptr{Cvoid}),
      iImageList, riid, ppvObj)
# iImageList : INT -> Int32
# riid : GUID* -> Ptr{GUID}
# ppvObj : void** out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t SHGetImageList(
    int32_t iImageList,
    void* riid,
    void** ppvObj);
]]
local shell32 = ffi.load("shell32")
-- shell32.SHGetImageList(iImageList, riid, ppvObj)
-- iImageList : INT
-- riid : GUID*
-- ppvObj : void** out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('SHELL32.dll');
const SHGetImageList = lib.func('__stdcall', 'SHGetImageList', 'int32_t', ['int32_t', 'void *', 'void *']);
// SHGetImageList(iImageList, riid, ppvObj)
// iImageList : INT -> 'int32_t'
// riid : GUID* -> 'void *'
// ppvObj : void** out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("SHELL32.dll", {
  SHGetImageList: { parameters: ["i32", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.SHGetImageList(iImageList, riid, ppvObj)
// iImageList : INT -> "i32"
// riid : GUID* -> "pointer"
// ppvObj : void** out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t SHGetImageList(
    int32_t iImageList,
    void* riid,
    void** ppvObj);
C, "SHELL32.dll");
// $ffi->SHGetImageList(iImageList, riid, ppvObj);
// iImageList : INT
// riid : GUID*
// ppvObj : void** out
// 構造体/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 Shell32 extends StdCallLibrary {
    Shell32 INSTANCE = Native.load("shell32", Shell32.class);
    int SHGetImageList(
        int iImageList,   // INT
        Pointer riid,   // GUID*
        Pointer ppvObj   // void** out
    );
}
@[Link("shell32")]
lib LibSHELL32
  fun SHGetImageList = SHGetImageList(
    iImageList : Int32,   # INT
    riid : GUID*,   # GUID*
    ppvObj : Void**   # void** out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef SHGetImageListNative = Int32 Function(Int32, Pointer<Void>, Pointer<Void>);
typedef SHGetImageListDart = int Function(int, Pointer<Void>, Pointer<Void>);
final SHGetImageList = DynamicLibrary.open('SHELL32.dll')
    .lookupFunction<SHGetImageListNative, SHGetImageListDart>('SHGetImageList');
// iImageList : INT -> Int32
// riid : GUID* -> Pointer<Void>
// ppvObj : void** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SHGetImageList(
  iImageList: Integer;   // INT
  riid: PGUID;   // GUID*
  ppvObj: Pointer   // void** out
): Integer; stdcall;
  external 'SHELL32.dll' name 'SHGetImageList';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SHGetImageList"
  c_SHGetImageList :: Int32 -> Ptr () -> Ptr () -> IO Int32
-- iImageList : INT -> Int32
-- riid : GUID* -> Ptr ()
-- ppvObj : void** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let shgetimagelist =
  foreign "SHGetImageList"
    (int32_t @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* iImageList : INT -> int32_t *)
(* riid : GUID* -> (ptr void) *)
(* ppvObj : void** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library shell32 (t "SHELL32.dll"))
(cffi:use-foreign-library shell32)

(cffi:defcfun ("SHGetImageList" shget-image-list :convention :stdcall) :int32
  (i-image-list :int32)   ; INT
  (riid :pointer)   ; GUID*
  (ppv-obj :pointer))   ; void** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SHGetImageList = Win32::API::More->new('SHELL32',
    'int SHGetImageList(int iImageList, LPVOID riid, LPVOID ppvObj)');
# my $ret = $SHGetImageList->Call($iImageList, $riid, $ppvObj);
# iImageList : INT -> int
# riid : GUID* -> LPVOID
# ppvObj : void** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。