Win32 API 日本語リファレンス
ホームStorage.FileSystem › SetFileApisToOEM

SetFileApisToOEM

関数
プロセスのファイルAPIをOEM文字セットに切り替える。
DLLKERNEL32.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

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

void SetFileApisToOEM(void);

パラメーターなし。戻り値: void

公式ドキュメント

プロセスのファイル I/O 関数が OEM 文字セットのコードページを使用するようにします。

解説(Remarks)

SetFileApisToOEM によってコードページが設定されるファイル I/O 関数とは、 KERNEL32.DLL がエクスポートする関数のうち、ファイル名を受け取るか返す関数を指します。 SetFileApisToOEM はコードページをスレッド単位やコンピューター単位ではなく、 プロセス単位で設定します。

SetFileApisToOEM 関数は SetFileApisToANSI 関数によって補完されます。SetFileApisToANSI は 同じファイル I/O 関数群が ANSI 文字セットのコードページを使用するようにします。

8 ビットのコンソール関数は既定で OEM コードページを使用します。それ以外のすべての関数は既定で ANSI コードページを 使用します。このため、コンソール関数が返す文字列が他の関数で正しく処理されない場合があり、その逆もまた同様です。たとえば、 FindFirstFileA 関数が 特定の拡張 ANSI 文字を含む文字列を返し、8 ビットのコンソール関数が OEM コードページを使用するように設定されている場合、 WriteConsoleA 関数はその文字列を 正しく表示できません。

ファイル I/O 関数群が現在どのコードページを使用しているかを判定するには、 AreFileApisANSI 関数を使用してください。8 ビットのコンソール関数の コードページを設定するには、 SetConsoleCP 関数と SetConsoleOutputCP 関数を使用してください。

コードページの非互換性の問題を解決するには、コンソールアプリケーションで Unicode を使用するのが最善です。Unicode を使用する コンソールアプリケーションは、8 ビットのコンソール関数を使用するものよりもはるかに汎用性が高くなります。その解決策を採れない場合、 コンソールアプリケーションは SetFileApisToOEM 関数を呼び出すことで、 ファイル I/O 関数群が ANSI 文字セットの文字列ではなく OEM 文字セットの文字列を使用するようにできます。これらの関数を ANSI コードページに戻すには、 SetFileApisToANSI 関数を使用してください。

コマンドラインを扱う場合、コンソールアプリケーションはコマンドラインを Unicode 形式で取得し、その後 関連する文字から OEM への変換関数を使用して OEM 形式に変換する必要があります。また、この場合、コマンドラインの main 関数の argv パラメーターの配列には ANSI 文字セットの文字列が含まれることにも注意してください。

Windows 8 および Windows Server 2012 では、この関数は次のテクノロジでサポートされています。

テクノロジ サポート
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 トランスペアレント フェールオーバー (TFO) はい
SMB 3.0 とスケールアウト ファイル共有 (SO) はい
クラスターの共有ボリューム ファイル システム (CsvFS) はい
回復性のあるファイル システム (ReFS) はい
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

void SetFileApisToOEM(void);
[DllImport("KERNEL32.dll", ExactSpelling = true)]
static extern void SetFileApisToOEM();
<DllImport("KERNEL32.dll", ExactSpelling:=True)>
Public Shared Sub SetFileApisToOEM()
End Sub
Declare PtrSafe Sub SetFileApisToOEM Lib "kernel32" ()
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SetFileApisToOEM = ctypes.windll.kernel32.SetFileApisToOEM
SetFileApisToOEM.restype = None
SetFileApisToOEM.argtypes = []
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
SetFileApisToOEM = Fiddle::Function.new(
  lib['SetFileApisToOEM'],
  [],
  Fiddle::TYPE_VOID)
#[link(name = "kernel32")]
extern "system" {
    fn SetFileApisToOEM();
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("KERNEL32.dll")]
public static extern void SetFileApisToOEM();
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_SetFileApisToOEM' -Namespace Win32 -PassThru
# $api::SetFileApisToOEM()
#uselib "KERNEL32.dll"
#func global SetFileApisToOEM "SetFileApisToOEM"
; SetFileApisToOEM
#uselib "KERNEL32.dll"
#func global SetFileApisToOEM "SetFileApisToOEM"
; SetFileApisToOEM
; void SetFileApisToOEM()
#uselib "KERNEL32.dll"
#func global SetFileApisToOEM "SetFileApisToOEM"
; SetFileApisToOEM
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procSetFileApisToOEM = kernel32.NewProc("SetFileApisToOEM")
)

r1, _, err := procSetFileApisToOEM.Call()
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // void
procedure SetFileApisToOEM; stdcall;
  external 'KERNEL32.dll' name 'SetFileApisToOEM';
result := DllCall("KERNEL32\SetFileApisToOEM", "Int")
●SetFileApisToOEM() = DLL("KERNEL32.dll", "int SetFileApisToOEM()")
# 呼び出し: SetFileApisToOEM()
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef SetFileApisToOEMNative = Void Function();
typedef SetFileApisToOEMDart = void Function();
final SetFileApisToOEM = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<SetFileApisToOEMNative, SetFileApisToOEMDart>('SetFileApisToOEM');
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
procedure SetFileApisToOEM; stdcall;
  external 'KERNEL32.dll' name 'SetFileApisToOEM';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SetFileApisToOEM"
  c_SetFileApisToOEM :: IO ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let setfileapistooem =
  foreign "SetFileApisToOEM"
    (void @-> returning void)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("SetFileApisToOEM" set-file-apis-to-oem :convention :stdcall) :void)
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SetFileApisToOEM = Win32::API::More->new('KERNEL32',
    'void SetFileApisToOEM()');
# my $ret = $SetFileApisToOEM->Call();
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目