核心編程邊讀邊小結(2)

回顧一下第一、二章的內容。第一章主要是說GetLastError ()函數和如何得到錯誤信息內容。第二章談字符處理。

一開始我想寫一個命令行的程序,讀入一個整數,輸出本地(中文)的錯誤信息,和書中的第一章程序類似的。

纔看完標準C++,想用std::cinstd::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來輸出中文字符是不行的。要輸出中文字符,還必須在標準空間中設一下國際化支持,這樣問題得到解決。對這個問題就有了兩個層次的考慮,一是LPTSTRstd::wstring的轉化,二是標準C++國際化支持。

 

最後小段代碼如下

 

  

 

 

 

另外第二章的重要內容就是WideCharToMultiByteMultiByteToWideChar這一對函數的用法。值得注意的是如果傳入目標字符串長爲0,則返回目標字符串轉換後的長度。下面的例子中,用wstrlen得到LPCTSTR的長,轉換的字符串要分配內存,最後釋放內存。

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章