函数原型转换

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 Data Types for Strings 中所述,泛型函数原型使用数据类型 LPCTSTR 作为文本参数。 但是,Windows 代码页原型使用类型 LPCSTR,而 Unicode 原型使用 LPCWSTR。

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

注意

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

 

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

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

注意

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

 

Windows API 中的 Unicode