回顾一下第一、二章的内容。第一章主要是说GetLastError ()函数和如何得到错误信息内容。第二章谈字符处理。
一开始我想写一个命令行的程序,读入一个整数,输出本地(中文)的错误信息,和书中的第一章程序类似的。
才看完标准C++,想用std::cin和std::cout来输入和输出,但SDK本身是用另一套宏来表示字符的,转来转去比我想像的要麻烦,不过最的解决方案却很简单——对复杂问题有个简单的答案从来都是很美的事。
先来说下要用的API函数。GetLastError非常简单,返回一个DWORD码,然后用这个码去找信息文字,用到的是FormatMessage。这又引出了两个问题,一个是DWORD dwLanguageId参数是指定语言区域,书中用MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)宏来得到。另一个是LPTSTR lpBuffer的参数是调用FormatMessage时分配的内存,使用方法按这样的步骤来:
1. 指定LPVOID lpBuffer。
2. 在调用时转型(LPTSTR)&lpBuffer作为FormatMessage的参数。
3. 然后在使用后要LocalFree掉。
然后是另外一个问题,想用sdt::cout来输出LPTSTR或(TCHAR*),直接的想法是能不能将它们转成std::string。结果是可以转成std::wstring,但发现直接用std::wcout来输出中文字符是不行的。要输出中文字符,还必须在标准空间中设一下国际化支持,这样问题得到解决。对这个问题就有了两个层次的考虑,一是LPTSTR到std::wstring的转化,二是标准C++国际化支持。
最后小段代码如下
另外第二章的重要内容就是WideCharToMultiByte和MultiByteToWideChar这一对函数的用法。值得注意的是如果传入目标字符串长为0,则返回目标字符串转换后的长度。下面的例子中,用wstrlen得到LPCTSTR的长,转换的字符串要分配内存,最后释放内存。