2

某些 Unicode 字符(如 )的代码点占用超过 2 个字节。如何使用CreateFile()这些字符的 Win32 API 函数?

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;

CHARWCHARWinNT.h中定义为:

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组中。
CreateFileW()接受LPCWSTR文件名,这些文件名在内部存储在 16 位数wchar_t组中。

我在C:\.txt位置创建了一个文件。似乎无法使用 打开此文件CreateFile(),因为它包含 Unicode 代码点为 0x24B62 的字符,即使在 WCHAR 数组单元格中也不适合。

但该文件存在于我的硬盘中,Windows 正常管理它。如何通过 Win32 API 函数打开这个文件,就像 Windows 在内部一样?

4

1 回答 1

7

此类字符由UTF-16 代理对表示。它需要两个宽字符元素来表示该代码点。因此,您只需要调用CreateFile传递必要的代理对。当然,您需要使用CreateFile.

大概您不会在代码中硬编码这样的文件名。在这种情况下,您将从文件对话框FindFirstFile等中获取它。这些 API 将为您提供文件的适当 UTF-16 编码缓冲区。

于 2012-09-28T16:52:17.393 回答