Windows 编程中恼人的各种字符以及字符指针类型

在Windows编程中,很容易见到这些数据类型:LPSTR,LPTSTR,LPCTSTR... 像很多童鞋一样,当初在学Windows编程的时候,对着些数据类型真的是丈二和尚,摸不着头脑,长时间不用就会想不起来。所以,下面就对此做一个总结。

首先,先来看一下ASCII编码和UNICODE编码的区别。下面是《Windows 程序设计》一书中对Unicode编码的说明:

简单地说,Unicode扩展自ASCII字符集。在严格的ASCII中,每个字符用7位表示,或者计算机上普遍使用的每字符有8位宽;而Unicode使用全16位字符集。

这使得Unicode能够表示世界上所有的书写语言中可能用于计算机通讯的字符、象形文字和其它符号。Unicode最初打算作为ASCII的补充,可能的话,

最终将代替它。考虑到ASCII是计算机中最具支配地位的标准,所以这的确是一个很高的目标。

可见,两者的区别在于:ASCII编码的一个字符(Chrater)在内存中占据一个字节(BYTE),而Unicode编码的字符中一个字符占两个字节。

接下来,我们看看Windows里面的一些常用数据类型。在Windows中数据类型的定义位于头文件"windef.h"和"winnt.h"中:

  1 //windef.h
  2 typedef unsigned long ULONG;
  3 typedef ULONG *PULONG;
  4 typedef unsigned short USHORT;
  5 typedef USHORT *PUSHORT;
  6 typedef unsigned char UCHAR;
  7 typedef UCHAR *PUCHAR;
  8 typedef char *PSZ;
  9
 10 typedef UINT WPARAM;
 11 typedef LONG LPARAM;
 12 typedef LONG LRESULT;
 13
 14 typedef unsigned long       DWORD;
 15 typedef int                 BOOL;
 16 typedef unsigned char       BYTE;
 17 typedef unsigned short      WORD;
 18 typedef float               FLOAT;
 19 typedef FLOAT               *PFLOAT;
 20 typedef BOOL near           *PBOOL;
 21 typedef BOOL far            *LPBOOL;
 22 typedef BYTE near           *PBYTE;
 23 typedef BYTE far            *LPBYTE;
 24 typedef int near            *PINT;
 25 typedef int far             *LPINT;
 26 typedef WORD near           *PWORD;
 27 typedef WORD far            *LPWORD;
 28 typedef long far            *LPLONG;
 29 typedef DWORD near          *PDWORD;
 30 typedef DWORD far           *LPDWORD;
 31 typedef void far            *LPVOID;
 32 typedef CONST void far      *LPCVOID;
 33
 34 typedef int                 INT;
 35 typedef unsigned int        UINT;
 36 typedef unsigned int        *PUINT;
 37
 38 //winnt.h
 39 typedef char CHAR;
 40 typedef short SHORT;
 41 typedef long LONG;
 42
 43 #ifndef _MAC
 44
 45 typedef unsigned short wchar_t;
 46 typedef wchar_t WCHAR;
 47
 48 typedef WCHAR *PWCHAR;
 49 typedef WCHAR *LPWCH, *PWCH;
 50 typedef CONST WCHAR *LPCWCH, *PCWCH;
 51 typedef WCHAR *NWPSTR;
 52 typedef WCHAR *LPWSTR, *PWSTR;
 53
 54 typedef CONST WCHAR *LPCWSTR, *PCWSTR;
 55
 56 //
 57 // ANSI (Multi-byte Character) types
 58 //
 59 typedef CHAR *PCHAR;
 60 typedef CHAR *LPCH, *PCH;
 61
 62 typedef CONST CHAR *LPCCH, *PCCH;
 63 typedef CHAR *NPSTR;
 64 typedef CHAR *LPSTR, *PSTR;
 65 typedef CONST CHAR *LPCSTR, *PCSTR;
 66
 67 //
 68 // Neutral ANSI/UNICODE types and macros
 69 //
 70 #ifdef  UNICODE                     // r_winnt
 71
 72 #ifndef _TCHAR_DEFINED
 73 typedef WCHAR TCHAR, *PTCHAR;
 74 typedef WCHAR TBYTE , *PTBYTE ;
 75 #define _TCHAR_DEFINED
 76 #endif /* !_TCHAR_DEFINED */
 77
 78 typedef LPWSTR LPTCH, PTCH;
 79 typedef LPWSTR PTSTR, LPTSTR;
 80 typedef LPCWSTR LPCTSTR;
 81 typedef LPWSTR LP;
 82 #define __TEXT(quote) L##quote      // r_winnt
 83
 84 #else   /* UNICODE */               // r_winnt
 85
 86 #ifndef _TCHAR_DEFINED
 87 typedef char TCHAR, *PTCHAR;
 88 typedef unsigned char TBYTE , *PTBYTE ;
 89 #define _TCHAR_DEFINED
 90 #endif /* !_TCHAR_DEFINED */
 91
 92 typedef LPSTR LPTCH, PTCH;
 93 typedef LPSTR PTSTR, LPTSTR;
 94 typedef LPCSTR LPCTSTR;
 95 #define __TEXT(quote) quote         // r_winnt
 96
 97 #endif /* UNICODE */                // r_winnt
 98 #define TEXT(quote) __TEXT(quote)   // r_winnt
 99
100
101 typedef SHORT *PSHORT;
102 typedef LONG *PLONG;    

从这些类型定义以及宏定义不难看出,Windows中基本上只是用大写字母来代替。

Windows编程中,最常见的莫过于文章开头提到的那些数据类型了,其实仔细观察,不难发现,LP代表的是"Long Pointer",及长指针,W代表Wide,宽字节,C代表CONST,即常量指针,代表该指针指向的内容只能读取,不能修改。TSTR则代表TCHAR。

对于如何选择使用何种表示类型,除了开发者的自身习惯外,Windows给出的建议是:

1 使用通用数据类型TCHAR来表示文本字符和字符串;

2 用明确的数据类型,如BYTE来表示字节,字节指针以及数据缓冲区;

3 使用_T宏来表示字面量字符或者字符串。

时间: 2024-10-04 08:34:30

Windows 编程中恼人的各种字符以及字符指针类型的相关文章

windows编程中的数据类型

在windows编程中,有许多奇怪的数据类型,初学者不知道这些代表什么,下面就把一些数据类型列出如下: ATOM 原子(原子表中的一个字符串的参考) BOOL 布尔变量 BOOLEAN 布尔变量 BYTE 字节(8位) CCHAR Windows字符 CHAR Windows字符 COLORREF 红.绿.蓝(RGB)彩色值(32位) Const 变量,该变量的值在执行期间保持为常量 CRITICAL_SECTION 临界段对象 CTRYID 国名标识符 DLGPROC 指向一个对话框过程的指针

Windows编程中char*转LPCWSTR解决办法总结

Windows编程中经常涉及到的一个问题是字符串之间的转换,开发过程总是遇到编译器提示无法格式转换的问题,于是自己总结了几种解决办法. 1.通过T2W转换宏 char* szStr = "balabala"; CString str = CString(szStr); USES_CONVERSION; LPCWSTR wszClassName = new WCHAR[str.GetLength()+1]; wcscpy((LPTSTR)wszClassName,T2W((LPTSTR)

Windows编程中char*转LPCWSTR解决的方法总结

Windows编程中常常涉及到的一个问题是字符串之间的转换,开发过程总是遇到编译器提示无法格式转换的问题.于是自己总结了几种解决的方法. 1.通过T2W转换宏 char* szStr = "balabala"; CString str = CString(szStr); USES_CONVERSION; LPCWSTR wszClassName = new WCHAR[str.GetLength()+1]; wcscpy((LPTSTR)wszClassName,T2W((LPTSTR

Windows编程中的堆管理(过于底层,一般不用关心)

摘要: 本文主要对Windows内存管理中的堆管理技术进行讨论,并简要介绍了堆的创建.内存块的分配与再分配.堆的撤销以及new和delete操作符的使用等内容. 关键词: 堆:堆管理 1 引言 在大多数Windows应用程序设计中,都几乎不可避免的要对内存进行操作和管理.在进行大尺寸内存的动态分配时尤其显的重要.本文即主要对内存管理中的堆管理技术进行论述. 堆(Heap)实际是位于保留的虚拟地址空间中的一个区域.刚开始时,保留区域中的多数页面并没有被提交物理存储器.随着从堆中越来越多的进行内存分

windows编程中关于“关闭窗口无法退出进程”的解决方法

一般会出现如下两种情况 1.WinMain函数中,最后阶段接收消息队列循环中,调用的GetMessage函数参数提供错误 如: while (GetMessage(&msg,hwnd, 0, 0))       {         TranslateMessage(&msg);         DispatchMessage(&msg);     } 这个错误往往是由于程序员疏忽大意造成的,个别编译器使用时会有自动补全(提示)功能,会提示GetMessage函数的第二个参数是一个H

Windows 编程中的字符串(2)

(1)windows写日志系统 1 void writeDebugEventLog(TCHAR* pszMessage, WORD wType) 2 { 3 //#ifdef _DEBUG 4 5 HANDLE hEventSource = NULL; 6 const TCHAR* lpszStrings[2] = { NULL, NULL }; 7 8 hEventSource = RegisterEventSourceW(NULL, L"DeviceMonitorService")

第七章 资源在Windows编程中的应用 P157 7-8

资源在基于SDK的程序设计中的应用实验 一.实验目的 1.掌握各种资源的应用及资源应用的程序设计方法.   二.实验内容及步骤 实验任务 1.熟悉菜单资源的创建过程: 2.熟悉位图资源的创建: 3.熟悉对话框资源的应用: 4.熟悉图标资源. 实验内容 在一个窗口中央加载一个任意位图,位图尺寸为窗口面积的四分之一,当单击鼠标左键或键盘上的向上箭头时,位图向上移动,当移动到窗口的上边界时,窗口显示"不能再向上移动了"字样,当单击鼠标右键或键盘上的向下箭头时,位图向下移动,当到达窗口的下边界

windows 编程中的常见bug

错误 1 :   error LNK2001: 无法解析的外部符号 [email protected]     解决办法:   ——>查看链接器->输入->附加依赖项,依照debug模式下修改(修改附加依赖项中多余的lib,确保依赖的Lib) 错误 2: error LNK1181: 无法打开输入文件“WinKillHook.lib” 解决办法:   ——>链接器中的输入选项

【Windows编程】系列第五篇:GDI图形绘制

上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数百个API可供我们使用,本篇把最常用的GDI绘图做一个讲解.GDI可以绘制点.直线曲线.填充封闭区域.位图以及文本,其中文本部分已经在上一篇中将了,请参考[Windows编程]系列第三篇:文本字符输出. 跟前面的GDI对象一样,本篇的这些绘图函数也必须要设备上下文句柄(HDC)作为函数参数,从前文我