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

GetICMProfileW

関数
DCに関連付けられたICMプロファイル名を取得する(Unicode版)。
DLLGDI32.dll文字セットUnicode (-W)呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// GDI32.dll  (Unicode / -W)
#include <windows.h>

BOOL GetICMProfileW(
    HDC hdc,
    DWORD* pBufSize,
    LPWSTR pszFilename   // optional
);

パラメーター

名前型方向説明
hdcHDCinカラープロファイルを取得する対象のデバイスコンテキストを指定します。
pBufSizeDWORD*inoutlpszFilename が指すバッファーのサイズを格納する DWORD へのポインター。この関数の ANSI 版ではサイズはバイト単位、Unicode 版では WCHAR 単位です。この関数が成功した場合、復帰時にこのパラメーターには実際に使用されたバッファーのサイズが格納されます。ただし、バッファーのサイズが十分でない場合、この関数は FALSE を返します。この場合、GetLastError() 関数は ERROR_INSUFFICIENT_BUFFER を返し、このパラメーターが指す DWORD には lpszFilename バッファーに必要なサイズが格納されます。
pszFilenameLPWSTRoutoptionalプロファイルのパス名を受け取るバッファーを指します。

戻り値の型: BOOL

公式ドキュメント

GetICMProfile 関数は、指定されたデバイスコンテキストの現在の出力カラープロファイルのファイル名を取得します。(Unicode)

戻り値

この関数が成功した場合、戻り値は TRUE です。また、lpszFilename パラメーターが NULL で、バッファーに必要なサイズが lpcbName にコピーされた場合も TRUE を返します。

この関数が失敗した場合、戻り値は FALSE です。

解説(Remarks)

GetICMProfile は、デバイスコンテキストでカラーマネージメントが有効かどうかにかかわらず、現在の出力プロファイルのファイル名を取得します。

デバイスコンテキストを指定すると、GetICMProfile は、そのデバイスコンテキストが現在使用しているカラープロファイルを含むファイルのパス名を、パラメーター lpszFilename を通じて出力します。また、パラメーター lpcbName を通じて、そのパス名を格納する文字列の長さを出力します。

GetICMProfile が返すプロファイル名が、EnumICMProfiles が返すプロファイルの一覧に含まれていない場合があります。EnumICMProfiles 関数は、デバイスコンテキスト (DC) に関連付けられているカラースペースプロファイルのうち、その設定が DC の設定と一致するものをすべて返します。SetICMProfile 関数を使用して現在のプロファイルを設定した場合、DC の設定と一致しないプロファイルが DC に関連付けられることがあります。たとえば、SetICMProfile 関数を使用して、デバイスに依存しない sRGB プロファイルを DC に関連付けることができます。このプロファイルはその DC の現在の WCS プロファイルとして使用され、GetICMProfile の呼び出しはそのファイル名を返します。しかし、このプロファイルは EnumICMProfiles から返されるプロファイルの一覧には現れません。

この関数を SetICMProfile 関数を呼び出す前に呼び出すと、デバイスコンテキストの既定のプロファイルを取得するために使用できます。

Windows 95/98/Me: GetICMProfileW は Microsoft Layer for Unicode でサポートされます。これを使用するには、Microsoft Layer for Unicode on Windows 95/98/Me Systems で説明されているとおり、特定のファイルをアプリケーションに追加する必要があります。

メモ

wingdi.h ヘッダーは GetICMProfile をエイリアスとして定義しており、UNICODE プリプロセッサー定数の定義に基づいて、この関数の ANSI 版と Unicode 版が自動的に選択されます。このエンコーディング中立のエイリアスを、エンコーディング中立でないコードと混在させて使用すると、不一致が生じ、コンパイルエラーや実行時エラーの原因となる場合があります。詳しくは、関数プロトタイプの規則 を参照してください。

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

各言語での呼び出し定義

// GDI32.dll  (Unicode / -W)
#include <windows.h>

BOOL GetICMProfileW(
    HDC hdc,
    DWORD* pBufSize,
    LPWSTR pszFilename   // optional
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("GDI32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern bool GetICMProfileW(
    IntPtr hdc,   // HDC
    ref uint pBufSize,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pszFilename   // LPWSTR optional, out
);
<DllImport("GDI32.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Public Shared Function GetICMProfileW(
    hdc As IntPtr,   ' HDC
    ByRef pBufSize As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> pszFilename As System.Text.StringBuilder   ' LPWSTR optional, out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' hdc : HDC
' pBufSize : DWORD* in/out
' pszFilename : LPWSTR optional, out
Declare PtrSafe Function GetICMProfileW Lib "gdi32" ( _
    ByVal hdc As LongPtr, _
    ByRef pBufSize As Long, _
    ByVal pszFilename As LongPtr) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetICMProfileW = ctypes.windll.gdi32.GetICMProfileW
GetICMProfileW.restype = wintypes.BOOL
GetICMProfileW.argtypes = [
    wintypes.HANDLE,  # hdc : HDC
    ctypes.POINTER(wintypes.DWORD),  # pBufSize : DWORD* in/out
    wintypes.LPWSTR,  # pszFilename : LPWSTR optional, out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('GDI32.dll')
GetICMProfileW = Fiddle::Function.new(
  lib['GetICMProfileW'],
  [
    Fiddle::TYPE_VOIDP,  # hdc : HDC
    Fiddle::TYPE_VOIDP,  # pBufSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pszFilename : LPWSTR optional, out
  ],
  Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "gdi32")]
extern "system" {
    fn GetICMProfileW(
        hdc: *mut core::ffi::c_void,  // HDC
        pBufSize: *mut u32,  // DWORD* in/out
        pszFilename: *mut u16  // LPWSTR optional, out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("GDI32.dll", CharSet = CharSet.Unicode)]
public static extern bool GetICMProfileW(IntPtr hdc, ref uint pBufSize, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pszFilename);
"@
$api = Add-Type -MemberDefinition $sig -Name 'GDI32_GetICMProfileW' -Namespace Win32 -PassThru
# $api::GetICMProfileW(hdc, pBufSize, pszFilename)
#uselib "GDI32.dll"
#func global GetICMProfileW "GetICMProfileW" wptr, wptr, wptr
; GetICMProfileW hdc, varptr(pBufSize), varptr(pszFilename)   ; 戻り値は stat
; hdc : HDC -> "wptr"
; pBufSize : DWORD* in/out -> "wptr"
; pszFilename : LPWSTR optional, out -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "GDI32.dll"
#cfunc global GetICMProfileW "GetICMProfileW" sptr, var, var
; res = GetICMProfileW(hdc, pBufSize, pszFilename)
; hdc : HDC -> "sptr"
; pBufSize : DWORD* in/out -> "var"
; pszFilename : LPWSTR optional, out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL GetICMProfileW(HDC hdc, DWORD* pBufSize, LPWSTR pszFilename)
#uselib "GDI32.dll"
#cfunc global GetICMProfileW "GetICMProfileW" intptr, var, var
; res = GetICMProfileW(hdc, pBufSize, pszFilename)
; hdc : HDC -> "intptr"
; pBufSize : DWORD* in/out -> "var"
; pszFilename : LPWSTR optional, out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	gdi32 = windows.NewLazySystemDLL("GDI32.dll")
	procGetICMProfileW = gdi32.NewProc("GetICMProfileW")
)

// hdc (HDC), pBufSize (DWORD* in/out), pszFilename (LPWSTR optional, out)
r1, _, err := procGetICMProfileW.Call(
	uintptr(hdc),
	uintptr(pBufSize),
	uintptr(pszFilename),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function GetICMProfileW(
  hdc: THandle;   // HDC
  pBufSize: Pointer;   // DWORD* in/out
  pszFilename: PWideChar   // LPWSTR optional, out
): BOOL; stdcall;
  external 'GDI32.dll' name 'GetICMProfileW';
result := DllCall("GDI32\GetICMProfileW"
    , "Ptr", hdc   ; HDC
    , "Ptr", pBufSize   ; DWORD* in/out
    , "Ptr", pszFilename   ; LPWSTR optional, out
    , "Int")   ; return: BOOL
●GetICMProfileW(hdc, pBufSize, pszFilename) = DLL("GDI32.dll", "bool GetICMProfileW(void*, void*, char*)")
# 呼び出し: GetICMProfileW(hdc, pBufSize, pszFilename)
# hdc : HDC -> "void*"
# pBufSize : DWORD* in/out -> "void*"
# pszFilename : LPWSTR optional, out -> "char*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "gdi32" fn GetICMProfileW(
    hdc: ?*anyopaque, // HDC
    pBufSize: [*c]u32, // DWORD* in/out
    pszFilename: [*c]u16 // LPWSTR optional, out
) callconv(std.os.windows.WINAPI) i32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc GetICMProfileW(
    hdc: pointer,  # HDC
    pBufSize: ptr uint32,  # DWORD* in/out
    pszFilename: ptr uint16  # LPWSTR optional, out
): int32 {.importc: "GetICMProfileW", stdcall, dynlib: "GDI32.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "gdi32");
extern(Windows)
int GetICMProfileW(
    void* hdc,   // HDC
    uint* pBufSize,   // DWORD* in/out
    wchar* pszFilename   // LPWSTR optional, out
);
ccall((:GetICMProfileW, "GDI32.dll"), stdcall, Int32,
      (Ptr{Cvoid}, Ptr{UInt32}, Ptr{UInt16}),
      hdc, pBufSize, pszFilename)
# hdc : HDC -> Ptr{Cvoid}
# pBufSize : DWORD* in/out -> Ptr{UInt32}
# pszFilename : LPWSTR optional, out -> Ptr{UInt16}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
int32_t GetICMProfileW(
    void* hdc,
    uint32_t* pBufSize,
    uint16_t* pszFilename);
]]
local gdi32 = ffi.load("gdi32")
-- gdi32.GetICMProfileW(hdc, pBufSize, pszFilename)
-- hdc : HDC
-- pBufSize : DWORD* in/out
-- pszFilename : LPWSTR optional, out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('GDI32.dll');
const GetICMProfileW = lib.func('__stdcall', 'GetICMProfileW', 'int32_t', ['void *', 'uint32_t *', 'uint16_t *']);
// GetICMProfileW(hdc, pBufSize, pszFilename)
// hdc : HDC -> 'void *'
// pBufSize : DWORD* in/out -> 'uint32_t *'
// pszFilename : LPWSTR optional, out -> 'uint16_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("GDI32.dll", {
  GetICMProfileW: { parameters: ["pointer", "pointer", "buffer"], result: "i32" },
});
// lib.symbols.GetICMProfileW(hdc, pBufSize, pszFilename)
// hdc : HDC -> "pointer"
// pBufSize : DWORD* in/out -> "pointer"
// pszFilename : LPWSTR optional, out -> "buffer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t GetICMProfileW(
    void* hdc,
    uint32_t* pBufSize,
    uint16_t* pszFilename);
C, "GDI32.dll");
// $ffi->GetICMProfileW(hdc, pBufSize, pszFilename);
// hdc : HDC
// pBufSize : DWORD* in/out
// pszFilename : LPWSTR optional, 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 Gdi32 extends StdCallLibrary {
    Gdi32 INSTANCE = Native.load("gdi32", Gdi32.class, W32APIOptions.UNICODE_OPTIONS);
    boolean GetICMProfileW(
        Pointer hdc,   // HDC
        IntByReference pBufSize,   // DWORD* in/out
        char[] pszFilename   // LPWSTR optional, out
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("gdi32")]
lib LibGDI32
  fun GetICMProfileW = GetICMProfileW(
    hdc : Void*,   # HDC
    pBufSize : UInt32*,   # DWORD* in/out
    pszFilename : UInt16*   # LPWSTR optional, out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef GetICMProfileWNative = Int32 Function(Pointer<Void>, Pointer<Uint32>, Pointer<Utf16>);
typedef GetICMProfileWDart = int Function(Pointer<Void>, Pointer<Uint32>, Pointer<Utf16>);
final GetICMProfileW = DynamicLibrary.open('GDI32.dll')
    .lookupFunction<GetICMProfileWNative, GetICMProfileWDart>('GetICMProfileW');
// hdc : HDC -> Pointer<Void>
// pBufSize : DWORD* in/out -> Pointer<Uint32>
// pszFilename : LPWSTR optional, out -> Pointer<Utf16>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetICMProfileW(
  hdc: THandle;   // HDC
  pBufSize: Pointer;   // DWORD* in/out
  pszFilename: PWideChar   // LPWSTR optional, out
): BOOL; stdcall;
  external 'GDI32.dll' name 'GetICMProfileW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "GetICMProfileW"
  c_GetICMProfileW :: Ptr () -> Ptr Word32 -> CWString -> IO CInt
-- hdc : HDC -> Ptr ()
-- pBufSize : DWORD* in/out -> Ptr Word32
-- pszFilename : LPWSTR optional, out -> CWString
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let geticmprofilew =
  foreign "GetICMProfileW"
    ((ptr void) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> returning int32_t)
(* hdc : HDC -> (ptr void) *)
(* pBufSize : DWORD* in/out -> (ptr uint32_t) *)
(* pszFilename : LPWSTR optional, out -> (ptr uint16_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library gdi32 (t "GDI32.dll"))
(cffi:use-foreign-library gdi32)

(cffi:defcfun ("GetICMProfileW" get-icmprofile-w :convention :stdcall) :int32
  (hdc :pointer)   ; HDC
  (p-buf-size :pointer)   ; DWORD* in/out
  (psz-filename :pointer))   ; LPWSTR optional, out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $GetICMProfileW = Win32::API::More->new('GDI32',
    'BOOL GetICMProfileW(HANDLE hdc, LPVOID pBufSize, LPWSTR pszFilename)');
# my $ret = $GetICMProfileW->Call($hdc, $pBufSize, $pszFilename);
# hdc : HDC -> HANDLE
# pBufSize : DWORD* in/out -> LPVOID
# pszFilename : LPWSTR optional, out -> LPWSTR
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い