# Win32 API

Win32 API に関するメモ

## ini ファイル

ini ファイルには、文字コードが ACP (日本語環境では Shift_JIS) のものと、Unicode (UTF-16 with LE BOM) のものがあります。
また、ini ファイルを操作する Win32 API には、char * を引数とする ANSI版 (GetPrivateProfileStringA, WritePrivateProfileStringA など) と、wchar_t * を引数とする Wide文字版 (GetPrivateProfileStringW, WritePrivateProfileStringW など) があります。
ini ファイル (ACP, Unicode) と API (ANSI版, Wide文字版) で 4 パターンの組み合わせが発生します。

- ACP ini file : Get/WritePrivateProfileStringA
- ACP ini file : Get/WritePrivateProfileStringW
- Unicode (UTF-16LE) ini file : Get/WritePrivateProfileStringA
- Unicode (UTF-16LE) ini file : Get/WritePrivateProfileStringW

Windows 2000 以降の API は、読み書き時に内部で ini ファイルの文字コードにあわせて自動的に変換が行われるようになっています。

- ANSI版の API で Unicode ini ファイルを扱うときには自動的に変換されます。
- Wide文字版の API で ACP ini ファイルを扱うときには自動的に変換されます。
- このため ini ファイルの文字コードによらず透過的に API を利用できます。
- Unicode ではない ini ファイルに ACP で表現できない Unicode 文字を書き込むと "?" に置換されて書き込まれます。
- ファイルの先頭に UTF-16LE BOM (0xff 0xfe) が付いているとき、ini ファイルは Unicode と判定されます。
  - 存在しないファイルに WritePrivateProfileStringA/W で書き込んで ini ファイルが新規作成されたときは、ACP で書き込まれます。
  - BOM (0xff 0xfe) だけの空ファイルを作っておいて、そのファイルに WritePrivateProfileStringA/W で書き込んだときは、Unicode で書き込まれます。

Windows NT 4 では、"ANSI版 API と ACP ini ファイルの組み合わせ", "Wide文字版 API と ACP ini ファイルの組み合わせ" が正しく動作するようです。
Wide文字版 API で ACP ini ファイルを扱う場合のみ自動的に変換されるようです。

Windows 95, 98, Me では、ANSI版 API と ACP ini ファイルの組み合わせのみが正しく動作するようです。
自動的な変換は行われないようです。

| Windows 2000- | Windows NT 4 | Windows 95, 98, Me
--- | --- | --- | ---
| ANSI API | Wide API | ANSI API | Wide API | ANSI API | Wide API
ACP ini file | OK | OK | OK | OK | OK | NG
Unicode (UTF-16LE) ini file | OK | OK | NG | NG | NG | NG