Win32 API 日本語リファレンス
ホームGlobalization › GetThreadPreferredUILanguages

GetThreadPreferredUILanguages

関数
スレッドの優先UI言語一覧を取得する。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSWindows Vista 以降

シグネチャ

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

BOOL GetThreadPreferredUILanguages(
    DWORD dwFlags,
    DWORD* pulNumLanguages,
    LPWSTR pwszLanguagesBuffer,   // optional
    DWORD* pcchLanguagesBuffer
);

パラメーター

名前方向説明
dwFlagsDWORDin

言語形式とフィルタリングを指定するフラグです。次のフラグは、スレッドの優先 UI 言語に使用する言語形式を指定します。これらのフラグは相互に排他的であり、既定値は MUI_LANGUAGE_NAME です。

Value Meaning
MUI_LANGUAGE_ID
言語文字列を language identifier 形式で取得します。
MUI_LANGUAGE_NAME
言語文字列を language name 形式で取得します。

次のフラグは、スレッドの優先 UI 言語の取得時に関数が使用するフィルタリングを指定します。既定のフラグは MUI_MERGE_USER_FALLBACK です。

Value Meaning
MUI_MERGE_SYSTEM_FALLBACK
システムフォールバックを使用し、リソースローダーが使用する言語リストと正確に一致するリストを取得します。このフラグは MUI_MERGE_USER_FALLBACK と組み合わせた場合にのみ使用できます。これらのフラグを組み合わせると、フォールバック言語と中立言語をリストに含めることで、通常の MUI_MERGE_USER_FALLBACK の動作が変化します。
MUI_MERGE_USER_FALLBACK
スレッドの優先 UI 言語、続いてプロセスの優先 UI 言語、続いてそれらと異なるユーザーの優先 UI 言語、続いてまだリストに含まれていなければシステム既定の UI 言語からなる複合リストを取得します。ユーザーの優先 UI 言語リストが空の場合、関数はシステムの優先 UI 言語を取得します。このフラグは MUI_THREAD_LANGUAGES と組み合わせることはできません。
MUI_THREAD_LANGUAGES
現在のスレッドのスレッド優先 UI 言語のみを取得します。現在のスレッドに優先言語が設定されていない場合は空のリストを取得します。このフラグは MUI_MERGE_USER_FALLBACK または MUI_MERGE_SYSTEM_FALLBACK と組み合わせることはできません。
MUI_UI_FALLBACK
完全なスレッド優先 UI 言語リストを、関連するフォールバック言語および中立言語とともに取得します。このフラグの使用は、MUI_MERGE_SYSTEM_FALLBACKMUI_MERGE_USER_FALLBACK を組み合わせることと同等です。(Windows 7 以降でのみ適用されます。)
pulNumLanguagesDWORD*outpwszLanguagesBuffer に取得された言語の数へのポインターです。
pwszLanguagesBufferLPWSTRoutoptional

省略可能。この関数が、dwFlags で指定された形式で、順序付けされた null 区切りのスレッド優先 UI 言語リストを取得するバッファーへのポインターです。このリストは 2 つの null 文字で終わります。

また、このパラメーターを NULL に設定し、pcchLanguagesBuffer を 0 に設定した場合、関数は必要な言語バッファーのサイズを pcchLanguagesBuffer に取得します。必要なサイズには 2 つの null 文字が含まれます。

pcchLanguagesBufferDWORD*inout

pwszLanguagesBuffer で示される言語バッファーのサイズ(文字単位)へのポインターです。関数が正常に復帰すると、このパラメーターには取得された言語バッファーのサイズが格納されます。

また、このパラメーターを 0 に設定し、pwszLanguagesBufferNULL に設定した場合、関数は必要な言語バッファーのサイズを pcchLanguagesBuffer に取得します。

戻り値の型: BOOL

公式ドキュメント

現在のスレッドの優先 UI 言語を取得します。詳細については、「User Interface Language Management」を参照してください。

戻り値

成功した場合は TRUE を、それ以外の場合は FALSE を返します。拡張エラー情報を取得するには、アプリケーションは GetLastError を呼び出すことができます。この関数は次のいずれかのエラーコードを返します。

その他の理由で関数が失敗した場合、パラメーター pulNumLanguages および pcchLanguagesBuffer は未定義です。

解説(Remarks)

アプリケーションが指定したフラグに応じて、この関数は、スレッドの優先 UI 言語、プロセスの優先 UI 言語、ユーザーの優先 UI 言語またはシステムの優先 UI 言語、およびシステム既定の UI 言語からなる複合リストを取得できます。重複する言語が見つかった場合、関数は最初の言語のみを取得します。

アプリケーションが SetThreadPreferredUILanguagesMUI_CONSOLE_FILTER または MUI_COMPLEX_SCRIPT_FILTER フラグ付きで呼び出している場合、GetThreadPreferredUILanguages は結果リスト内の言語をフィルタリングします。関数は、コンソールが表示できない言語を代替言語に置き換えます。ある言語の代替は、その言語の LOCALE_SCONSOLEFALLBACKNAME の値から決定されます。コンソールに関する詳細は、SetThreadUILanguage の説明を参照してください。

MUI_LANGUAGE_NAME フラグは、補助ロケールに対応する Language Interface Pack (LIP) 言語の処理をより適切に行えるため、MUI_LANGUAGE_ID よりも MUI_LANGUAGE_NAME の使用が推奨されます。

MUI_LANGUAGE_ID を指定した場合、取得される言語文字列は 16 進数の言語識別子になります。

これらには先頭の 0x は含まれず、長さは 4 文字です。たとえば、en-US は "0409" として、

en は "0009" として返されます。

アプリケーションが MUI_LANGUAGE_ID フラグを設定した場合、スレッドの優先 UI 言語には補助ロケールに対応する 1 つ以上の言語が含まれることがあります。関数が正常に復帰すると、言語バッファーには補助ロケールに対応する言語に対して "1400" が格納されます。このリストにそのような言語は 1 つしか存在できません。文字列 "1400" は LOCALE_CUSTOM_UI_DEFAULT の 16 進数値に対応します。また、関数が正常に復帰すると、補助ロケールに対応するその他の言語に対して pwszLanguagesBuffer には "1000" が格納されます。文字列 "1000" は LOCALE_CUSTOM_UNSPECIFIED の 16 進数値に対応します。これは補助ロケールを区別できないため、いかなる関数への入力としても有用ではありません。

C# Signature

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        static extern System.Boolean GetThreadPreferredUILanguages(
            System.UInt32 dwFlags,
            ref System.UInt32 pulNumLanguages,
            System.IntPtr pwszLanguagesBuffer,
            ref System.UInt32 pcchLanguagesBuffer
            );
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

BOOL GetThreadPreferredUILanguages(
    DWORD dwFlags,
    DWORD* pulNumLanguages,
    LPWSTR pwszLanguagesBuffer,   // optional
    DWORD* pcchLanguagesBuffer
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool GetThreadPreferredUILanguages(
    uint dwFlags,   // DWORD
    out uint pulNumLanguages,   // DWORD* out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pwszLanguagesBuffer,   // LPWSTR optional, out
    ref uint pcchLanguagesBuffer   // DWORD* in/out
);
<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function GetThreadPreferredUILanguages(
    dwFlags As UInteger,   ' DWORD
    <Out> ByRef pulNumLanguages As UInteger,   ' DWORD* out
    <MarshalAs(UnmanagedType.LPWStr)> pwszLanguagesBuffer As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef pcchLanguagesBuffer As UInteger   ' DWORD* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' dwFlags : DWORD
' pulNumLanguages : DWORD* out
' pwszLanguagesBuffer : LPWSTR optional, out
' pcchLanguagesBuffer : DWORD* in/out
Declare PtrSafe Function GetThreadPreferredUILanguages Lib "kernel32" ( _
    ByVal dwFlags As Long, _
    ByRef pulNumLanguages As Long, _
    ByVal pwszLanguagesBuffer As LongPtr, _
    ByRef pcchLanguagesBuffer As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetThreadPreferredUILanguages = ctypes.windll.kernel32.GetThreadPreferredUILanguages
GetThreadPreferredUILanguages.restype = wintypes.BOOL
GetThreadPreferredUILanguages.argtypes = [
    wintypes.DWORD,  # dwFlags : DWORD
    ctypes.POINTER(wintypes.DWORD),  # pulNumLanguages : DWORD* out
    wintypes.LPWSTR,  # pwszLanguagesBuffer : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # pcchLanguagesBuffer : DWORD* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
GetThreadPreferredUILanguages = Fiddle::Function.new(
  lib['GetThreadPreferredUILanguages'],
  [
    -Fiddle::TYPE_INT,  # dwFlags : DWORD
    Fiddle::TYPE_VOIDP,  # pulNumLanguages : DWORD* out
    Fiddle::TYPE_VOIDP,  # pwszLanguagesBuffer : LPWSTR optional, out
    Fiddle::TYPE_VOIDP,  # pcchLanguagesBuffer : DWORD* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "kernel32")]
extern "system" {
    fn GetThreadPreferredUILanguages(
        dwFlags: u32,  // DWORD
        pulNumLanguages: *mut u32,  // DWORD* out
        pwszLanguagesBuffer: *mut u16,  // LPWSTR optional, out
        pcchLanguagesBuffer: *mut u32  // DWORD* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true)]
public static extern bool GetThreadPreferredUILanguages(uint dwFlags, out uint pulNumLanguages, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder pwszLanguagesBuffer, ref uint pcchLanguagesBuffer);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_GetThreadPreferredUILanguages' -Namespace Win32 -PassThru
# $api::GetThreadPreferredUILanguages(dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer)
#uselib "KERNEL32.dll"
#func global GetThreadPreferredUILanguages "GetThreadPreferredUILanguages" sptr, sptr, sptr, sptr
; GetThreadPreferredUILanguages dwFlags, varptr(pulNumLanguages), varptr(pwszLanguagesBuffer), varptr(pcchLanguagesBuffer)   ; 戻り値は stat
; dwFlags : DWORD -> "sptr"
; pulNumLanguages : DWORD* out -> "sptr"
; pwszLanguagesBuffer : LPWSTR optional, out -> "sptr"
; pcchLanguagesBuffer : DWORD* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global GetThreadPreferredUILanguages "GetThreadPreferredUILanguages" int, var, var, var
; res = GetThreadPreferredUILanguages(dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer)
; dwFlags : DWORD -> "int"
; pulNumLanguages : DWORD* out -> "var"
; pwszLanguagesBuffer : LPWSTR optional, out -> "var"
; pcchLanguagesBuffer : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL GetThreadPreferredUILanguages(DWORD dwFlags, DWORD* pulNumLanguages, LPWSTR pwszLanguagesBuffer, DWORD* pcchLanguagesBuffer)
#uselib "KERNEL32.dll"
#cfunc global GetThreadPreferredUILanguages "GetThreadPreferredUILanguages" int, var, var, var
; res = GetThreadPreferredUILanguages(dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer)
; dwFlags : DWORD -> "int"
; pulNumLanguages : DWORD* out -> "var"
; pwszLanguagesBuffer : LPWSTR optional, out -> "var"
; pcchLanguagesBuffer : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procGetThreadPreferredUILanguages = kernel32.NewProc("GetThreadPreferredUILanguages")
)

// dwFlags (DWORD), pulNumLanguages (DWORD* out), pwszLanguagesBuffer (LPWSTR optional, out), pcchLanguagesBuffer (DWORD* in/out)
r1, _, err := procGetThreadPreferredUILanguages.Call(
	uintptr(dwFlags),
	uintptr(pulNumLanguages),
	uintptr(pwszLanguagesBuffer),
	uintptr(pcchLanguagesBuffer),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function GetThreadPreferredUILanguages(
  dwFlags: DWORD;   // DWORD
  pulNumLanguages: Pointer;   // DWORD* out
  pwszLanguagesBuffer: PWideChar;   // LPWSTR optional, out
  pcchLanguagesBuffer: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'GetThreadPreferredUILanguages';
result := DllCall("KERNEL32\GetThreadPreferredUILanguages"
    , "UInt", dwFlags   ; DWORD
    , "Ptr", pulNumLanguages   ; DWORD* out
    , "Ptr", pwszLanguagesBuffer   ; LPWSTR optional, out
    , "Ptr", pcchLanguagesBuffer   ; DWORD* in/out
    , "Int")   ; return: BOOL
●GetThreadPreferredUILanguages(dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer) = DLL("KERNEL32.dll", "bool GetThreadPreferredUILanguages(dword, void*, char*, void*)")
# 呼び出し: GetThreadPreferredUILanguages(dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer)
# dwFlags : DWORD -> "dword"
# pulNumLanguages : DWORD* out -> "void*"
# pwszLanguagesBuffer : LPWSTR optional, out -> "char*"
# pcchLanguagesBuffer : DWORD* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef GetThreadPreferredUILanguagesNative = Int32 Function(Uint32, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>);
typedef GetThreadPreferredUILanguagesDart = int Function(int, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>);
final GetThreadPreferredUILanguages = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<GetThreadPreferredUILanguagesNative, GetThreadPreferredUILanguagesDart>('GetThreadPreferredUILanguages');
// dwFlags : DWORD -> Uint32
// pulNumLanguages : DWORD* out -> Pointer<Uint32>
// pwszLanguagesBuffer : LPWSTR optional, out -> Pointer<Utf16>
// pcchLanguagesBuffer : DWORD* in/out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetThreadPreferredUILanguages(
  dwFlags: DWORD;   // DWORD
  pulNumLanguages: Pointer;   // DWORD* out
  pwszLanguagesBuffer: PWideChar;   // LPWSTR optional, out
  pcchLanguagesBuffer: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'GetThreadPreferredUILanguages';
import Foreign
import Foreign.C.Types
import Foreign.C.String

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

let getthreadpreferreduilanguages =
  foreign "GetThreadPreferredUILanguages"
    (uint32_t @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> returning int32_t)
(* dwFlags : DWORD -> uint32_t *)
(* pulNumLanguages : DWORD* out -> (ptr uint32_t) *)
(* pwszLanguagesBuffer : LPWSTR optional, out -> (ptr uint16_t) *)
(* pcchLanguagesBuffer : DWORD* in/out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("GetThreadPreferredUILanguages" get-thread-preferred-uilanguages :convention :stdcall) :int32
  (dw-flags :uint32)   ; DWORD
  (pul-num-languages :pointer)   ; DWORD* out
  (pwsz-languages-buffer :pointer)   ; LPWSTR optional, out
  (pcch-languages-buffer :pointer))   ; DWORD* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $GetThreadPreferredUILanguages = Win32::API::More->new('KERNEL32',
    'BOOL GetThreadPreferredUILanguages(DWORD dwFlags, LPVOID pulNumLanguages, LPWSTR pwszLanguagesBuffer, LPVOID pcchLanguagesBuffer)');
# my $ret = $GetThreadPreferredUILanguages->Call($dwFlags, $pulNumLanguages, $pwszLanguagesBuffer, $pcchLanguagesBuffer);
# dwFlags : DWORD -> DWORD
# pulNumLanguages : DWORD* out -> LPVOID
# pwszLanguagesBuffer : LPWSTR optional, out -> LPWSTR
# pcchLanguagesBuffer : DWORD* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目