函数原型转换

Windows SDK 在泛型、Windows代码页Unicode 版本中提供函数原型。 可以将原型编译为生成Windows代码页原型或 Unicode 原型。 本主题中讨论了这三个原型,由 SetWindowText 函数的代码示例演示。

以下是通用原型的示例。

BOOL SetWindowText(
  HWND hwnd,
  LPCTSTR lpText
);

标头文件提供以宏形式实现的通用函数名称。

#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE

预处理器将宏扩展到Windows代码页或 Unicode 函数名称中。 在泛型函数名称的末尾添加字母“A” (ANSI) 或“W” (Unicode) 。 然后,头文件提供两个特定的原型,一个用于Windows代码页,一个用于 Unicode,如以下示例所示。

BOOL SetWindowTextA(
  HWND hwnd,
  LPCSTR lpText
);
BOOL SetWindowTextW(
  HWND hwnd,
  LPCWSTR lpText
);

Windows字符串数据类型中所述,泛型函数原型使用数据类型 LPCTSTR 作为文本参数。 但是,Windows 代码页原型使用类型 LPCSTR,而 Unicode 原型使用 LPCWSTR。

对于所有含有文本参数的函数,应用程序一般应使用通用函数原型。 如果应用程序在头文件的 #include 语句之前或编译期间定义“UNICODE”,则语句将编译为 Unicode 函数。

注意

新的Windows应用程序应使用 Unicode 来避免不同代码页的不一致以及便于本地化。 应使用泛型函数编写它们,并应定义 UNICODE 以将函数编译为 Unicode 函数。 在应用程序必须处理 8 位字符数据的几个位置中,它可以显式使用Windows代码页的函数。

 

应用程序应始终使用通用函数原型配合通用字符串和字符类型。 所有以大写字母“W”结尾的函数名称都采用 Unicode(即宽字符)参数。 某些函数仅存在于 Unicode 版本中,并且只能与适当的数据类型一起使用。 例如, LCIDToLocaleNameLocaleNameToLCID 只有 Unicode 版本。

每个 Unicode 和字符集函数的参考文档中的“要求”部分提供有关受支持操作系统实现的函数版本的信息。 如果包含以“Unicode”开头的行,该函数具有单独的 Unicode 和Windows代码页版本。

注意

当函数具有字符串的长度参数时,该长度应记录为字符串中的 TCHAR 值计数。 此数据类型是指函数的Windows代码页版本的字节,或 Unicode 版本的 16 位单词。 但是,需要或返回指向非类型化内存块(如 GlobalAlloc 函数)的指针的函数通常采用字节大小,而不考虑所使用的原型。 如果非类型化内存的分配用于字符串,则应用程序必须将字符数乘以大小为 (TCHAR) 。 有关详细信息,请参阅 使用泛型数据类型

 

Windows API 中的 Unicode