日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ATL 和 MFC 字符转换宏

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 ALPSTR字符, OLE LPOLESTR字符, T LPTSTR字符, W LPWSTR字符。如果宏的名字中含有C,表示該宏將會轉換成一個Const string,例如, W2CA LPWSTR 轉換成LPCSTR., A2W LPSTR 轉換成 LPWSTR, OLE2T LPOLESTR t轉換成 LPTSTR……

????ATL宏的行為取決于編譯器指令生成效果,如果源字符和目的字符類型相同,就不會發生轉換動作,編譯器在預編譯過程中將會將宏名種的TOLE參照如下表進行轉換。

?

是否存在下列預編譯宏

?

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 字符转换宏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。