ATL 和 MFC 字符转换宏
ATL 和 MFC 字符轉換宏?
ATL3.0
??????ATL3.0中的W2T ,T2W等一系列宏很方便,但一定要小心,它們從棧上分配內存,直到調用它的函數返回前,該內存不會被釋放,如果在一個循環中,這類宏被你反復調用幾萬次時,你將不可避免地產生stack overflow 。解決的方法是,將用到該宏的語句獨立封裝成一個函數,這樣就可以無限次調用了。
???ATL3.0的主要宏如下:
?
?? 使用方法如下.
????? #include <atlconv.h>
?????? void StringFunc(LPSTR lpsz)
?????? {
?? ???????USES_CONVERSION;
? ????????LPWSTR x = A2W(lpsz);
? ????????// Do something with x
?????? }
??? 這些宏的名字有一它的意義, 被轉換的字符在左邊(如: A) 轉換后的字符在后邊(如:W),2表示To ,A是LPSTR字符,, OLE 是LPOLESTR字符, T 是 LPTSTR字符, W 是 LPWSTR字符。如果宏的名字中含有C,表示該宏將會轉換成一個Const string,例如, W2CA 將LPWSTR 轉換成LPCSTR., A2W 將 LPSTR 轉換成 LPWSTR, OLE2T 將LPOLESTR t轉換成 LPTSTR……
????ATL宏的行為取決于編譯器指令生成效果,如果源字符和目的字符類型相同,就不會發生轉換動作,編譯器在預編譯過程中將會將宏名種的T和OLE參照如下表進行轉換。
?
| 是否存在下列預編譯宏 | ? | T 成為 | OLE成為 |
| 沒有定義 | A | W | |
| 定義了_UNICODE | W | W | |
| 定義了OLE2ANSI | A | A | |
| 定義了_UNICODE 和OLE2ANSI | W | A | |
?
ATL7.0
?
????????? ATL7.0增加了幾種新的宏和類,對已有的宏做了很大的該進.
???? ATL7.0宏名形如如下形式 --- C(源字符類型)2[C](目的字符類型) [EX]
?????? 其中:
·??源字符類型和目的字符類型參照下表。
· 如果目的字符類型要求是常量,則需要 [C]。
·??如果需要以參數形式指定目的字符內存初始化大小,則需要[EX]。
| 源字符類型/目的字符類型 | 說?????? 明 |
| A | ANSI character string. |
| W | Unicode character string. |
| T | Generic character string (equivalent to W when _UNICODE is defined, equivalent to A otherwise). |
| OLE | OLE character string (equivalent to W). |
例如,將一個Unicode? string 轉換成 普通string 而不改變源string ,可以用CW2CT。如果已經知道轉換后的字符不會超過64個字符,可以選擇含有EX的宏,并將大小限制以參數形式指定如:CW2CTEX<64>。
????????ATL7.0新增的轉換類: (CA2AEX, CA2WEX, CW2AEX, and CW2WEX) ,他們需要修正的靜態存儲區來保結果,如果轉換后的字符過大,超出了靜態存儲區內存大小,這些類會自動釋放內存,保證了安全性,避免了ATL3.0中宏在循環過程中會將棧占滿。7.0對空字符的輸入做了處理,如果輸入為空字符,返回空,不會分配內存。
????????? 部分代碼如下
?????? #define COLE2T CW2T?????????????????????????????????????????? #define COLE2TEX CW2TEX
?????? #define COLE2CT CW2CT????????????????????????????????????? #define COLE2CTEX CW2CTEX
?????? #define CT2OLE CT2W?????????????????????????????????????????? #define CT2OLEEX CT2WEX
?????? #define CT2COLE CT2CW????????????????????????????????????? #define CT2COLEEX CT2CWEX
?????? class CW2WEX, ???????????????????????????????????????????????? ??? ?class CA2AEX
?????? typedef CW2WEX<> CW2W ???????????????????????????? ?? ?typedef CA2AEX<> CA2A
?????? class CA2CAEX?????????????????????????????????????????????? ???? ???class CW2CWEX
?????? typedef CA2CAEX<> CA2CA ????????????????????????? ??? ??typedef CW2CWEX<> CW2CW
?????? class CA2WEX???????????????????????????????????????????????? ? ??? ??class CW2AEX
??? typedef CA2WEX<> CA2W???????????????????????????????? ?? typedef CW2AEX<> CW2A
?????????ATL3.0字符轉換宏和ATL7.0字符轉換宏和轉換類的主要區別如下:
?
?
| ATL 3.0 字符轉換宏 | ??????????? ?ATL 7.0字符轉換類 |
| 在棧上分配內存 | 小字符在棧上分配,大字符在堆上分配 |
| 函數退出后,轉換后的字符被釋放 | 當超出一定的使用限制時,字符才被釋放 |
| 沒有意外情況處理 | 有意外情況處理 |
| 不適合在循環中使用 | 可以在循環中使用 |
| 棧空間有限, 不適合大字符 | 字符大小沒有限制,可以在堆上分配內存 |
| 需要定義USES_CONVERSION宏 | 不需要定義USES_CONVERSION宏 |
| OLE的類型取決于OLE2ANSI宏的定義 | OLE類型總是和 W類型相同 |
總結
以上是生活随笔為你收集整理的ATL 和 MFC 字符转换宏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬盘能修吗
- 下一篇: 我搜集的C++字符类型的相互转换