第一部分程序员必读
Szq整理使用
1章对程序错误的处理
(1)常见的Windows函数的返回类型:
VOID无返回值型,该函数的运行不可能失败。Windows函数很少此类型
BOOL函数运行失败则返回0,否则返回非0
HANDLE失败则返回NULL,否则返回一个可操作的对象的 Han die
注:有些函数会返回一个句柄值    INVALID_HANDLE_VALUE它被定义为-1。函数的 Platform SDK
文档将会清楚地说明该函数运行失败时返回的是    NULL还是INVALID_HANDLE_VALID
PVOID :函数运行失败,则返回值是 NULL,否则返回PVOID,以标识数据块的 内存地址
LONG/DWORD这是个难以处理的值。返回数量的函数通常返 LONGDWORD 如果由于某种原因函数无 法对想要进行计数的对象进行计数, 那么该函数通常 返回0-1 (根据函数而定)。如果调用的函数返回了 LONG/DWORD那么请 认真阅读Platform SDK文档以确保能正确检查潜在的错误。
(2)当某Windows函数运行错误时,可以通过调用 DWORD GetLast Error函数获 取调用该函数的关联线程的32位错误代码。其具体的错误文本以列表形式存放 于头文件中,在VC中调试时,也可以 通过在Watch窗口键入“@err,h来获取 所调用函数的运行错误代码和具体的错误文本。
Windows还提供了一个函数,可以将错误代码转换成它的文本描述。该函数 称为FormatMessage,该函数的格式如下:
DWORD FormatMessage(
DWORD dwFlags
LPCVOID pSource
DWORD dwMessageID,
DWORD dwLa nguagelD,
PTSTR pszBuffer,
DWORD nSize, va_list *Argument );
2004118
Trackback: 第一章 程序员必读
定义自己的错误代码
若你编写了一个希望其他人调用的函数,你的函数可能因为这样或那样的原因 而运行失败, 你必须向函数的调用者说明它已经运行失败。 若要指明函数运行失 败,只 需要设定线程的最后的错误代码,然后让你的函数返回    FALSE
INVALID_HANDLE_VALUENULL或者返回任何合适的信息。可以用 Viod SetLastError(DWORD dwErrCod设定线程的最后错误代码;
ErrorShow示例小程序
FormatMessage函数的用法
if (hloca != NULL)
{
SetDlgItemText(hwnd , IDC_ERRORTEXT , (PCTSTR) LocalLock(hlocal) );
LocalFree(hlocal);
}
else
{
SetDlgItemText(hwnd , IDC_ERRORTEXT , TEXT("Error number not found") );
当调用 FormatMessage函数时,传递了 FORMAT_MESSAGE_FROM_SYSTE该标志告诉FormatMessage函数,我们想要系统定义的错误代码的字符串。还 传递FORMAT_MESSAGE_ALLOCATE_BUF标志,告诉该函数为错误代码的文本 描述分 配足够大的内存块。该内存块的句柄将 hlocal 变量中返回。第三个参数 指明想要查的错误代码的号码,第四个参数指明想要文本描述使用什么语言。
2004119
第二章 Unicode
Uni code -宽字节字符集是是为了解决软件本地化多语言版本化而定制的一项 技术标准。Unicode字符串中的所有字符都是16位的两个字 节,程序员只需 要对指针进行递增或者递减, 就可以遍历字符串中的各个字符, 不在需要像单字 节字符一样去判断下一字节是属于同一字符的组成部分还是一个新 字符。
使用Uni code,有几个好处,可以很容易地在不同语言之间进行数据交换、使 你能够分配支持所有语言的单个二进制.exe文件或DLL文件、提高应用程序的运 行效率。
Windows 操作系统对 Unicode 的支持:
Win dows 2000既支持Uni code,也支持ANSI,因此可以为任意一种开发应用程 序。
Windows 98只支持ANSI,只能为ANSI开发应用程序。
Win dows CE只支持Uni code,只能为Un icode开发应用程序。
因为COM通常用于使不同的组件能够互相进行通信, 而Uni code则是传递字符 串的最佳手段。所以需要字符串的所有 COM接口方法都只能接受Unicode字符 串。
如何编写 Unicode 源代码
CUnicode的支持
定义一个名字为 wchar_t 的数据类型,它便是一个 Unicode 字符的数据类型。 For example,如果想要创建一个缓存,用于存放最多为 99个字符的Uni code字 符串和一个结尾为零的字符,可以使用下面这个语句:
wchar_t szBuffer[100];
当然,C里面的字符串函数,如strcpystrchrstrcat等,只能对ANSI字符串 进行操作,不能正确处理 Unicode,因此,ANSI C补充了一组函数:
ANSI: char * strchr(const char * , int);
Unicode: wchar_t * wcschr(const wchar_t * , wchar_t);
ANSI: int strcmp(const char * , const char *);
Unicode: int wcscmp(const wchar_t * , const wchar_t *);
ANSI: char * strcpy(char * , const char *);
Unicode: wchar_t * wcscpy(wchar_t * , const wchar_t *);
ANSI: size_t strlen(const char *);
Unicode size_t wcslen(const wchar_t *);
请注意,所有的Unicode函数均以wcs开头,wcs是宽字符串的英文缩写。若要 调用Unicode
函数只需用前缀wcs来取代ANSI字符串函数的前缀str即可。
一般情况下,对ANSIUni code字符操作的函数不要写在同一个源代码文件中, 这会给编译器编译带来很多麻烦 (编译错误 ),但实在有必要的时候,也可以将他 们放在同一个源代码文件中,这时候就需要包含一个头文件 。
头文件的唯一作用是就是帮助创建 ANSI/U ni code通用的源代码文件。它的工作 机制是,通过一组宏,来决定调用的是    str函数还是 wcs函数。For example
在中定义有一个宏为_tcscpy,如果在包含该头文件时没有定义 _UNICODE_tcscpy就想当于 ANSIstrcpy,如果定义了 _UNICODELtcscpy 想当于 wcscpy 函数。
还有一个值得注意的是,使用了中的宏的时候,若要生成一个 Un icode字符串 而不是一个ANSI字符串,则必须在字符串前加上一个大写字符 LFor example :
TCHAR * szError= L"Error";
大写字母L的用意是告诉编译器,该字符串应该作为    Unicode字符来编译。此举
随之带来的问题是,我们还需要定义个宏来动态添加大写字母    L,以适应
Unicode/ANSI通用源代码文件。这个宏便是 _TEXT
TCHAR *szError = _TEXR("Error")
如上这样定义的话,就不论源代码文件中是否定义了    —UNICODE编译器都能够
正确辨认并编译。此外,_TEXT宏还可以用于检验字符串的首字母。For example :
if(szError[0] ==_TEXT('J'))
文本串视为字符数组,而不是 chars 数组或字节数组。
2•将通用数据类型(如TCHARPTSTR用于文本字符和字符串。
3•将显式数据类型(如BYTEPBYTE用于字节、字节指针和数据缓存。
4•TEXT宏用于原义字符和字符串。
5•执行全局性替换(例如用 PTSTF替换PSTR
6.修改字符串运算问题。例如函数通常希望你在字符中传递一个缓存的大小, 而不是字节。这意味着你不应该传递 字符串拷贝函数strcpy作用sizeof(szBuffer) ,而应该传递
(sizeof(szBuffer)/sizeof(TCHAR。)另外,如果需要为字符串分配一个内存块,并 且拥有该字符串中的字符数目, 那么请记住要按字节来分配内存。 这就是说,应 该调用 malloc (nCharacters *sizeof(TCHAR))而不是调用
malloc(nCharacte® 在上面所说的所有原则中,这是最难记住的一条原则,女口 果操作错误,编译器将不发出任何警告。
Windwos 提供了如下一组对 Unicode 字符串进行操作的函数:
lstrcat 将一个字符串置于另一个字符串的结尾处
lstrcmp 对两个字符串进行区分大小写的比较
lstrcmpi 对两个字符串进行不区分大小写的比较
lstrcpy 将一个字符串拷贝到内存中的另外一个位置

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。