2

一部のUnicode文字(など)のコードポイントは、2バイト以上を消費します。CreateFile()これらの文字のようにWin32API関数を使用するにはどうすればよいですか?

WinBase.h

WINBASEAPI
__out
HANDLE
WINAPI
CreateFileA(
    __in     LPCSTR lpFileName,
    __in     DWORD dwDesiredAccess,
    __in     DWORD dwShareMode,
    __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    __in     DWORD dwCreationDisposition,
    __in     DWORD dwFlagsAndAttributes,
    __in_opt HANDLE hTemplateFile
    );
WINBASEAPI
__out
HANDLE
WINAPI
CreateFileW(
    __in     LPCWSTR lpFileName,
    __in     DWORD dwDesiredAccess,
    __in     DWORD dwShareMode,
    __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    __in     DWORD dwCreationDisposition,
    __in     DWORD dwFlagsAndAttributes,
    __in_opt HANDLE hTemplateFile
    );
#ifdef UNICODE
#define CreateFile  CreateFileW
#else
#define CreateFile  CreateFileA
#endif // !UNICODE

LPCSTRとLPCWSTRは、WinNT.hで次のように定義されています。

typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;

CHARWinNT.hでは次のようにWCHAR定義されています。

typedef char CHAR;
#ifndef _MAC
typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character
#else
// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
typedef unsigned short WCHAR;    // wc,   16-bit UNICODE character
#endif

CreateFileA()LPCSTR内部で8ビットchar配列に格納されているファイル名を受け入れます。内部で16ビット配列に格納されているファイル名
CreateFileW()を受け入れます。LPCWSTRwchar_t

C:\。txtの位置にファイルを作成しました。を使用してこのファイルを開くことはできないようですCreateFile()。これは、Unicodeコードポイントが0x24B62であり、WCHAR配列セルにも収まらない文字が含まれているためです。

しかし、そのファイルは私のハードディスクに存在し、Windowsはそれを正常に管理します。Windowsが内部で行うように、Win32 API関数でこのファイルを開くにはどうすればよいですか?

4

1 に答える 1

7

このような文字は、 UTF-16サロゲートペアで表されます。そのコードポイントを表すには、2つのワイド文字要素が必要です。したがって、CreateFile必要なサロゲートペアを渡すように呼び出す必要があります。そして当然、のワイドバリアントを使用する必要がありますCreateFile

おそらく、そのようなファイル名をコードにハードコーディングすることはないでしょう。この場合、ファイルダイアログFindFirstFileなどから取得します。これらのAPIは、ファイルに適切なUTF-16エンコードバッファを提供します。

于 2012-09-28T16:52:17.393 に答える