システムのロケール構成またはそのシステムのキーボード タイプ構成は、カーネル レベルで呼び出される API に影響しますか? 具体的には、プログラムが「CreateFile()」API を呼び出している場合、Windows API のドキュメントには、呼び出しが CreateFileA または CreateFileW のいずれかに委任されると記載されています。そのプログラムが中国語キーボードを備えた中国に存在するシステムで実行されている場合、2 つの関数のどちらが呼び出されますか?
1 に答える
Unicode と Locale は、完全に直交する 2 つの概念です。
CreateFileA
vsに関してCreateFileW
- これを制御する設定はコンパイル時の設定です。アプリケーションが Unicode 文字セットで実行するCreateFileW
ようにコンパイルされている場合、コンパイル設定でアプリケーションをマルチバイト アプリケーションとしてコンパイルする必要があることが示されている場合、 が呼び出されます。その後、CreateFileA
呼び出されます。
Visual Studio C++ を使用している場合は、アプリケーションのプロジェクト設定を調べます。[構成プロパティ] の下の [一般] ページには、[文字セット] の設定があります。これは、[Unicode 文字セットを使用] または [マルチバイト文字セットを使用] に設定できます。この設定の効果は、別のプロパティ シートをソリューションに自動的に追加することです - プロパティ マネージャーの下に表示されます: 「Unicode サポート」プロパティ シートは、プリプロセッサ定義 " _UNICODE,UNICODE
" を追加します - 「マルチバイト文字サポート」プロパティ シートは、代わりに "_MBCS を追加します"。
ここで、定義をCreateFile
見ると、それがマクロそのものであることがわかります。アプリケーションをビルドするとCreateFile
、コード内のすべての呼び出しは、定義されてCreateFileW
いる場合は呼び出しに解決され、そうでない場合は呼び出しに解決されます。UNICODE
CreateFileA
UNICODE
windows.h
Windows API 呼び出しの Wide バージョンと Ansi バージョンを切り替えるために使用されます。
_MBCS
また_UNICODE
、Microsoft C ランタイム ヘッダー (主に tchar.h) によって使用され、c-library がシングル バイトからマルチバイト、さらにそれをサポートする関数の Unicode 文字をサポートするように切り替えます。