Windos学习旅程-Error和UNICODE(二)

///////////////////////////////////////////////////////////
//1.Error
///////////////////////////////////////////////////////////  
  Windows的Error表示结构有三部分组成:
    1.ID
    2.MessageID
    3.MessageText
    Windows提供了一个API来显示MessageText

DWORD FormatMessage(
  DWORD dwFlags,      
// source and processing options
  LPCVOID lpSource,   // pointer to  message source
  DWORD dwMessageId,  // requested message identifier
  DWORD dwLanguageId, // language identifier for requested message
  LPTSTR lpBuffer,    // pointer to message buffer
  DWORD nSize,        // maximum size of message buffer
  va_list *Arguments  // pointer to array of message inserts
);
   当我们系统运行成功地时候并不能表示我们系统并没有Error,我们调用GetLastError()(在调试错误的时候用此方法使用起来特别的爽)就可以知道我们系统是有我们未知的错误。
   如果想自己定义个Error,可以用SetError()API.
///////////////////////////////////////////////////////////
//2.UNICODE
///////////////////////////////////////////////////////////  
  当我学了UNICODE这一部分内容才知道为啥Windows要自己定义一些鬼类型,比如说PCHAR,PSTR等等。这些类型都是为了兼容UNICODE用的,因为Windows2000以后的系统底层用的编码是UNICODE的,即使你在程序里面用的是ANSI类型,当Windows也会默认的给你加一个字节去处理按照UNICODE去运行,当运行完成后,在把UNICODE的转化成ANSI类型返回给应用系统。但是为了向后兼容Windows对于以前ANSI/UNICODE编码分别提供了对应的API,如我们最长见的CreateWindow API
#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExA(
0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExW(
0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#ifdef UNICODE
#define CreateWindow  CreateWindowW
#else
#define CreateWindow  CreateWindowA
#endif // !UNICODE
如果我们编译用的是UNICODE,将调用的是CreateWindowW(),如果是ANSI调用的是CreateWindowA()
Windows除了定义UNICODE这个宏以外还定义了,_TEXT()等宏。。
Windows系统中对于宏的应用可谓是出神入化,在MFC中RTTI等超NB的机制都是用宏来实现的,在这儿也就不详述了。

posted on 2007-11-16 13:29  john.huang  阅读(308)  评论(0编辑  收藏  举报

导航