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