• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            專注于c++的學(xué)習(xí)

            還是專注于c++的學(xué)習(xí)

            統(tǒng)計(jì)

            留言簿(1)

            閱讀排行榜

            評(píng)論排行榜

            《windows核心編程》讀書筆記2-chapter2

            如果調(diào)用任何windows函數(shù),并傳遞給他一個(gè)ANSI字符串,系統(tǒng)會(huì)先將這個(gè)字符串轉(zhuǎn)換為unicode字符串,然后將這個(gè)unicode字符串傳遞給操作系統(tǒng)。這樣你就理解,為什么在windows平臺(tái)上,使用unicode的效率要相對(duì)更高一些。

            所以,我們可以通過在一開始就是用unicode開發(fā)應(yīng)用程序,使程序執(zhí)行更有效率。

             

            1.1     Windows ceunicode

            為了保持windows ce的精致,ms決定不支持ansiwindows函數(shù)。所以,如果要進(jìn)行windows ce上的程序開發(fā),必須了解并在整個(gè)應(yīng)用程序中使用unicde

             

            1.2     關(guān)于COM

            Ms在將COM組建從16位移植到32位系統(tǒng)使,作出了一個(gè)決定:素有需要字符串的COM接口方法只支持unicode字符串。

             

            1.3     如何編寫unicode源代碼

            1.3.1  C運(yùn)行庫的unicode支持

            標(biāo)準(zhǔn)cstring.h頭文件中個(gè)定義了一個(gè)wchar_tunicode字符數(shù)據(jù)類型。

            typdef unsigned long wchar_t;

            標(biāo)準(zhǔn)c還專門為wchar_t定義了一組函數(shù)。

            char* strcat(char*, const char*);

            wchar_t* wcscat(wchat_t* , const wchar_t*);

             

            size_t strlen(const char*);

            size_t wcslen(const wchar_t*);

            所有的unicode字符串都以wcs開頭,代表寬字符。為了調(diào)用unicode,簡單的將ansi字符串的str替換為wcs即可。

             

            TChar.h頭文件主要為為了幫助ANSI/Unicode通用源代碼文件的編寫,他主要由一系列的宏組成,在編寫源代碼時(shí),可以使用這些宏來替代對(duì)strwcs函數(shù)直接的調(diào)用。

             

            Msc++編譯器將所有的字符串默認(rèn)都認(rèn)為是ansi字符串,而不是unicode字符串。所以,對(duì)于下面的這句話:

            TCHAR *szError = “Error”;

            如果沒有定義_UNICODE宏,則能夠編譯通過,但是如果定義了該宏,則會(huì)出現(xiàn)編譯錯(cuò)誤。

            為了生成一個(gè)UNICODE字符串而非一個(gè)ansi字符串,需要將以上的一句改為:

            TCHAR *szError = L”Error”;

             

            那么為了同時(shí)兼容上面的兩種情況,我們定義一個(gè)宏

            #ifdef _UNICODE

            #define _TEXT(x) L ## x

            #else

            #define _TEXT(x) x

            #endif

             

            這樣我們就可以重寫以上的語句:

            TCHAR* szError = _TEXT(“Error);

             

            1.3.2  Windows定義的unicode數(shù)據(jù)類型

            WCHAR  Unicode字符

            PWSTR   指向Unicode字符串的 指針

            PCWSTR  指向Unicode字符串常量的指針

             

            Windows.h中同樣定義了ansi/Unicode通用的數(shù)據(jù)類型

            PTSTR

            PCTSTR

            在編譯這個(gè)模塊時(shí),是否定義了UNICODE宏決定了這些數(shù)據(jù)類型指向ansi還是unicode

             

             

            注意, _UNICODE是標(biāo)準(zhǔn)cunicode開關(guān);

            UNICODEwindowsunicode開關(guān)。

             

            所以,一般來說,這兩個(gè)宏要么同時(shí)定義,要么同時(shí)不定義。

             

             

            1.3.3  Windows系統(tǒng)中的unicode函數(shù)和ansi函數(shù)

            windows2000下,CreateWindowsExA只是一個(gè)簡單的轉(zhuǎn)換層,他實(shí)現(xiàn)內(nèi)存分配并把ansi字符串轉(zhuǎn)換為unicode字符串,然后調(diào)用CreateWindowsExW函數(shù),把轉(zhuǎn)換后unicode字符串傳遞給該函數(shù)。當(dāng)CreateWindowsExW返回時(shí),CreateWindowsExA釋放內(nèi)存緩沖區(qū),并且返回其窗口句柄。

             

             

            1.4     讓應(yīng)用程序符合ansiunicode規(guī)范

            下面是一些基本規(guī)則:

            l  對(duì)于文本字符和串使用通用數(shù)據(jù)類型;

            l  對(duì)字節(jié)、字節(jié)指針和數(shù)據(jù)緩沖區(qū)使用顯式數(shù)據(jù)類型;

            l  對(duì)文字字符和字符串使用TEXT宏;

            l  修改字符串運(yùn)行問題, 使用sizeof(szbuffer)/sizeof(TCHAR)而不是sizeof(szbuffer);

            l  分配內(nèi)存時(shí),使用malloc(len*sizeof(TCHAR)) 而不是malloc(len);

             

            1.4.1  Windows字符串函數(shù)

            第一個(gè)CompareString參數(shù)指定一個(gè)32位的位置IDLCID),用來識(shí)別具體的語言種類,CompareString使用LCID,通過檢查適用于特定語言的字符的意義來比較字符串。

             

            sprintf()系列函數(shù)的應(yīng)用

             

            char szA[100];

            wchar_t szW[100];

             

            //normal

            sprintf(szA, “%s”, “ANSI Str”);

             

            //convert Unicode to ansi

            sprintf(szA, “%S”, L”ANSI Str”);

             

            //normal

            swprintf(szW, L“%s, L”ANSI Str”);

             

            //convert Ansi To unicode

            swprintf(szW, L”%S”, “ANSI Str”);

            這里要注意格式化字符串的中s字符的大小寫;

             

            1.4.2  資源

            Vc程序的內(nèi)部資源字符串其實(shí)也是unicode的,在使用LoadString來加載資源時(shí),如果是ansi,則其實(shí)是現(xiàn)將內(nèi)部的unicode轉(zhuǎn)換為ansi,然后在返回。

             

            1.4.3  確定文本是ansi還是unicode

            DWORD IsTextUnicode(CONST PVOID pvBuffer, int cb, PINT pResult);

            用于判斷指定的文本為ansi還是unicode

            這個(gè)函數(shù)使用的是統(tǒng)計(jì)的方法論來分析緩沖區(qū)內(nèi)的文本是ansi還是unicode,所以他也有可能返回一個(gè)錯(cuò)誤的結(jié)果。

            1.4.4  unicodeansi之間轉(zhuǎn)換

            這里其實(shí)就是涉及到兩個(gè)函數(shù)

            WideCharToMultiByte()

            MultiByteToWideChar()

            通過查看函數(shù)的原型,我們可以發(fā)現(xiàn)WideCharToMulteByteMultiByteToWideChar多了兩個(gè)參數(shù),pDefaultChar, pfUsedDefaultChar,如果寬字符不能轉(zhuǎn)換某字符,則函數(shù)應(yīng)該使用參數(shù)pDefaultChar指向的字符,如果該參數(shù)為NULL,函數(shù)使用系統(tǒng)默認(rèn)的字符。默認(rèn)的字符為問號(hào)(這就是為什么在英文系統(tǒng)下,中文字符總是顯示為問號(hào)的原因),問號(hào)用于文件名是危險(xiǎn)的,因?yàn)閱柡檬且环N通配符。

            posted on 2009-10-24 14:20 拿磚拍 閱讀(315) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 讀書筆記

            評(píng)論

            # re: 《windows核心編程》讀書筆記2-chapter2 2009-10-27 00:35 新開天龍八部私服

            注意格式化字符串的中s字符的大小寫,這一點(diǎn)一定要記清楚。  回復(fù)  更多評(píng)論   

            # re: 《windows核心編程》讀書筆記2-chapter2 2009-10-27 00:36 天龍八部私服

            寫得不錯(cuò)也,學(xué)習(xí)了。  回復(fù)  更多評(píng)論   

            日韩欧美亚洲综合久久影院Ds| 久久99精品综合国产首页| 国产亚州精品女人久久久久久 | 天天躁日日躁狠狠久久| 99久久久国产精品免费无卡顿| 一本色道久久综合| 国产毛片欧美毛片久久久| 久久亚洲国产中v天仙www| 久久亚洲精品无码aⅴ大香| 日韩欧美亚洲综合久久影院d3| 亚洲国产成人久久笫一页| 久久青青草原国产精品免费 | 免费观看成人久久网免费观看| 综合久久一区二区三区| 国产成人久久精品二区三区| 国产亚洲精品久久久久秋霞| 亚洲国产精品久久久久网站| 久久久久国产精品嫩草影院| 99久久婷婷国产综合精品草原| 久久久免费精品re6| 国产精品久久久久久久人人看| 99久久国产综合精品网成人影院| 色妞色综合久久夜夜 | 亚洲国产成人久久精品动漫| 久久久久久久波多野结衣高潮 | 久久频这里精品99香蕉久| 国产精自产拍久久久久久蜜| 久久er国产精品免费观看2| 色偷偷偷久久伊人大杳蕉| 国内精品久久久久影院薰衣草| 中文字幕无码av激情不卡久久| 欧美日韩成人精品久久久免费看| 久久精品国产影库免费看| 久久久久综合网久久| 秋霞久久国产精品电影院| 一本久久a久久精品综合夜夜 | 久久精品国产一区二区三区| 久久国产乱子伦精品免费午夜| 久久99精品久久久久久秒播| 女同久久| 少妇高潮惨叫久久久久久 |