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

SetFileApisToANSI

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

シグネチャ

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

void SetFileApisToANSI(void);

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

公式ドキュメント

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

解説(Remarks)

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

SetFileApisToANSI 関数は、同じファイル I/O 関数群が OEM 文字セットのコード ページを使用するようにする SetFileApisToOEM 関数を補完するものです。

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 では、この関数は次のテクノロジでサポートされています。

テクノロジ サポート
Server Message Block (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 SetFileApisToANSI(void);
[DllImport("KERNEL32.dll", ExactSpelling = true)]
static extern void SetFileApisToANSI();
<DllImport("KERNEL32.dll", ExactSpelling:=True)>
Public Shared Sub SetFileApisToANSI()
End Sub
Declare PtrSafe Sub SetFileApisToANSI Lib "kernel32" ()
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

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

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

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procSetFileApisToANSI = kernel32.NewProc("SetFileApisToANSI")
)

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

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

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

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

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

関連項目

公式の関連項目