AIL轉換巨集

2023-01-13 15:30:02 字數 2205 閱讀 5791

使用 atl 提供的轉換巨集。

a2bstr ole2a t2a w2a

a2cole ole2bstr t2bstr w2bstr

a2ct ole2ca t2ca w2ca

a2cw ole2ct t2cole w2cole

a2ole ole2cw t2cw w2ct

a2t ole2t t2ole w2ole

a2w ole2w t2w w2t

上表中的巨集函式,其實非常容易記憶:

2 好搞笑的縮寫,to 的發音和 2 一樣,所以借用來表示「轉換為、轉換到」的含義。

a ansi 字串,也就是 mbcs。

w、ole 寬字串,也就是 unicode。

t 中間型別t。如果定義了 _unicode,則t表示w;如果定義了 _mbcs,則t表示a

c const 的縮寫

首先,先介紹下uses_conversion為何物。

uses_conversion是atl中的乙個巨集定義。用於編碼轉換(用的比較多的是cstring向lpcwstr轉換)。通俗的說,就是你用了這個巨集後,就可以用一系列的字串轉換巨集,有ole到t,t到ole,ole到w,w到ole等等,非常方便。

或者說,這個巨集會告訴編譯器,在緊接的**中我們要用ole庫中**(如ansi 到unicode 的a2w(...))的轉換巨集,不加uses_conversion在使用a2w會出錯。

要想使用這個巨集,因為它是atl庫帶的,所以要加上標頭檔案 #include <>。

關於uses_conversion的使用,下面是從網上摘來的一段話,講的很不錯。

uses_conversion是atl中的乙個巨集定義。用於編碼轉換(用的比較多的是cstring向lpcwstr轉換)。在atl下使用要包含標頭檔案#include ""

使用uses_conversion一定要小心,它們從堆疊上分配記憶體,直到呼叫它的函式返回,該記憶體不會被釋放。如果在乙個迴圈中,這個巨集被反覆呼叫幾萬次,將不可避免的產生stackoverflow。

在乙個函式的迴圈體中使用a2w等字元轉換巨集可能引起棧溢位。

#include <>

void fn() }}

讓我們來分析以上的轉換巨集

#define a2w(lpa) (\

((_lpa = lpa) == null) ? null : (\

_convert = (lstrlena(_lpa)+1),\

atla2whelper((lpwstr) alloca(_convert*2), _lpa, _convert)))

#define atla2whelper atla2whelper

inline lpwstr winapi atla2whelper(lpwstr lpw, lpcstr lpa, int nchars, uint acp)

關鍵的地方在 alloca 記憶體分配記憶體上。

#define alloca _alloca

_alloca

allocates memory on the stack.

remarks

_alloca allocates size bytes from the program stack. the allocated space is automatically freed when the calling function

exits. therefore, do not pass the pointer value returned by _alloca as an argument to free.

問題就在這裡,分配的記憶體是在函式的棧中分配的。而vc編譯器預設的棧記憶體空間是2m。當在乙個函式中迴圈呼叫它時就會不斷的分配棧中的記憶體。

以上問題的解決辦法:

1、自己寫字元轉換函式,不要偷懶

function that safely converts a 'wchar' string to 'lpstr':

char* convertlpwstrtolpstr (lpwstr lpwszstrin)

} return pszout;

}等等乙個乙個的實現。

2、把字元轉換部分放到乙個函式中處理。

void fn2()

void fn()

}如果不知道這點問題,在使用後崩潰時很難查出崩潰原因的。

巨集程序簡介

在程式設計工作中,我們經常把能完成某一功能的一系列指令像子程式那樣存人儲存器,用乙個總指令來代表它們,使用時只需給出這個總指令就能執行其功能所存人的這一系列指令稱作使用者巨集程式本體,簡稱巨集程式。這個總指令稱作使用者巨集程式呼叫指令。在程式設計時,程式設計員只要記住巨集指令而不必記住巨集程式。使用...

光電轉換常識

光電轉換器的小知識 提問 經常聽到有人提起光貓,這個是什麼樣的裝置,他起到什麼作用。一般情況下光貓都是和哪些裝置進行連線的,連線線纜使用的是什麼呢?it168解答 光貓是目前中小公司包括大型公司經常使用到的一種網路裝置。光貓即光modem,是光電收發器或者光電轉換器的俗稱,兩者之間沒有太大的區別,都...

轉換道方案

舊居道路與遂資高速公路 k56 528.16處交叉道路轉換方案 一 工程概況 遂資高速於k56 528.16樁號與 舊居道路垂直交叉,遂資高速下穿舊居道路。該交叉設計為主跨45公尺砼板拱立交橋,橋梁全長73.32m,橋兩端與舊居道路相接,橋位軸線與舊居道路中心線吻合。該橋位於遂資高速高挖方地段,為施...