?? 00000029.htm
字號:
數(shù)據(jù)(例如,char字符串)。即使你在程序中只用到Unicode字符串,這都是事實(shí)。 <br /> 你不能在Windows CE上處理一個ANSI字符串,因?yàn)闆]有操縱它們的庫函數(shù)。最好的 <br />解決辦法是將ANSI字符串轉(zhuǎn)換成Unicode字符串用到H/PC上,然后再將Unicode字符串轉(zhuǎn) <br />換回ANSI字符串用到PC上。為了完成這些轉(zhuǎn)換,可采用MultiByteToWideChar()和WideC <br />harToMultiByte () Win32 API 函數(shù)。 <br />5. 對于Windows CE 1.0的字符串轉(zhuǎn)換,劈開(hack) <br /> 在Windows CE 1.0 版本中,這些Win32API函數(shù)還沒有完成。所以如果你想既要支持 <br />CE 1.0又能支持CE 2.0,就必須采用其它函數(shù)。將ANSI字符串轉(zhuǎn)換成Unicode字符串可以 <br />用wsprintf(),其中第一個參數(shù)采用一widechar字符串,并且認(rèn)識"%S"(大寫),意思是 <br />一個字符串。由于沒有wsscanf() 和 wsprintfA(),你必須想別的辦法將Unicode字符串 <br />轉(zhuǎn)換回ANSI字符串。由于Windows CE 1.0不在國家語言支持(NLS)中,你也許得求助于h <br />ack,如下所示: <br />/* <br />Definition / prototypes of conversion functions <br />Multi-Byte (ANSI) to WideChar (Unicode) <br />atow() converts from ANSI to widechar <br />wtoa() converts from widechar to ANSI <br />*/ <br />#if ( _WIN32_WCE >= 101) <br />#define atow(strA, strW, lenW) \ <br />MultiByteToWidechar (CP_ACP, 0, strA, -1, strW, lenW) <br />#define wtoa(strW, strA, lenA) \ <br />WideCharToMutiByte (CP_ACP, 0, strW, -1, strA, lenA, NULL, NULL) <br />#else /* _WIN32_WCE >= 101)*/ <br />/* <br />MultiByteToWideChar () and WideCharToMultiByte() not supported on Windows CE <br /> 1.0 <br />*/ <br />int atow(char *strA, wchar_t *strW, int lenW); <br />int wtoa(wchar_t *strW, char *strA, int lenA); <br />endif /* _WIN32_WCE >= 101*/ <br />#if (_WIN32_WCE <101) <br />int atow(char *strA, wchar_t *strW, int lenW) <br />{ <br /> int len; <br />char *pA; <br />wchar_t *pW; <br />/* <br />Start with len=1, not len=0, as string length returned <br />must include null terminator, as in MultiByteToWideChar() <br />*/ <br />for(pA=strA, pW=strW, len=1; lenW; pA++, pW++, lenW--, len++) <br />{ <br /> *pW = (lenW = =1) ? 0 : (wchar_t)( *pA); <br />if( ! (*pW)) <br />break; <br />} <br />return len; <br />} <br />int wtoa(wxhar_t *strW, char *strA, int lenA) <br />{ <br /> int len; <br />char *pA; <br />wchar_t *pW; <br />/* <br /> Start with len=1,not len=0, as string length returned <br /> Must include null terminator, as in WideCharToMultiByte() <br />*/ <br />for(pA=strA, pW=strW, len=1; lenA; pa++, pW++, lenA--, len++) <br />{ <br />pA = (len==1)? 0 : (char)(pW); <br />if(!(*pA)) <br /> break; <br /> } <br /> return len; <br />} <br /> #endif /*_WIN32_WCE<101*/ <br /> 這種適合于Windows CE 1.0的實(shí)現(xiàn)辦法比使用wsprintf()函數(shù)要容易,因?yàn)槭褂脀s <br />printf()函數(shù)更難以限制目標(biāo)指針?biāo)赶虻淖址拈L度。 <br />6. 選擇正確的字符串比較函數(shù) <br /> 如果你要分類Unicode標(biāo)準(zhǔn)字符串,你會有以下幾個函數(shù)可供選擇: <br />wcscmp(), wcsncmp(), wcsicmp(), 和wcsnicmp() <br />wcscoll(), wcsncoll(), wcsicoll(),和wcsnicoll() <br />CompareString() <br /> 第一類函數(shù)可用來對字符串進(jìn)行比較,不參考當(dāng)?shù)兀↙ocale)或外文字符。如果你 <br />永遠(yuǎn)不想支持外文,或者你僅僅想測試一下兩個字符串的內(nèi)容是否相同,這類函數(shù)非常 <br />好用。 <br /> 第二類函數(shù)使用現(xiàn)有的當(dāng)?shù)卦O(shè)置(current locale settings)(系統(tǒng)設(shè)置,除非你在 <br />字符串比較函數(shù)之前調(diào)用了wsetlocale()函數(shù))來比較兩個字符串。這些函數(shù)也能正確 <br />分類外文字符。如果當(dāng)?shù)氐淖址?amp;quot;C"("C" locale)被選定,這些函數(shù)與第一類函數(shù)就具 <br />有了相同的功能。 <br /> 第三類函數(shù)是Win32函數(shù)CompareString()。這個函數(shù)類似于第二類函數(shù),但是它允 <br />許你指定當(dāng)?shù)卦O(shè)置(the locale)作為一個參數(shù),而不是使用現(xiàn)有的當(dāng)?shù)卦O(shè)置(current <br /> locale settings)。CompareString()函數(shù)允許你選擇性地指定兩個字符串的長度。你 <br />可以將第二個參數(shù)設(shè)置為NORM_IGNORECASE,從而使函數(shù)比較字符串時不比較大小寫。 <br /> 通常,即使不將第二個參數(shù)設(shè)置為NORM_IGNORECASE,CompareString()函數(shù)也不用 <br />來區(qū)分大小寫。我們經(jīng)常用wcsncoll()函數(shù)來區(qū)分大小寫,除非使用當(dāng)?shù)氐淖址?amp;quot;C"(" <br />C" locale)。所以,在我們的代碼中,不使用CompareString()函數(shù)來區(qū)分大小寫,而 <br />用wcsncoll()函數(shù)來區(qū)分大小寫 <br />7. 不要使用相對路徑 <br /> 與Windows NT不一樣,Windows CE沒有當(dāng)前目錄這個概念,因此,任何路徑只是相 <br />對于根目錄而言的。如果你的軟件給文件或目錄使用相對路徑,那么你很可能把它們移 <br />到別的地方了。例如,路徑".\abc"在Windows CE中被當(dāng)作"\abc"看待。 <br />8.移走了對calloc()和 time()函數(shù)的調(diào)用 <br /> C運(yùn)行庫中的calloc()函數(shù)不能使用,但是malloc()函數(shù)可以代替calloc()函數(shù)。并 <br />且不要忘記,calloc()函數(shù)初始化時分配的內(nèi)存為零,而malloc()函數(shù)不一樣。同樣, <br />time()函數(shù)也不能使用,但你可以使用Win32函數(shù)GetSystemTime()函數(shù)代替time()函數(shù) <br />。 <br /> 經(jīng)過以上的警告后,你會高興地學(xué)習(xí)最后令你驚訝的兩點(diǎn)忠告。 <br />9. 不需要改變Win32 輸入/輸出(I/O)文件的調(diào)用 <br /> Win32的輸入輸出函數(shù),Windows CE也支持。允許你象訪問Win32文件系統(tǒng)那樣訪問 <br />對象。CreateFile()函數(shù)在Windows CE中不能辯認(rèn)標(biāo)志FILE_FLAG_RANDOM_ACCESS,但是 <br />這個標(biāo)志僅用作可選的磁盤訪問,并且不影響函數(shù)調(diào)用的功能。 <br />10. 不要擔(dān)心字節(jié)的狀態(tài) <br /> 當(dāng)我們把應(yīng)用程序?qū)懭隬indows CE時,有了一個美好的發(fā)現(xiàn),那就是Windows CE的 <br />數(shù)字?jǐn)?shù)據(jù)類型的字節(jié)狀態(tài)與Intel結(jié)構(gòu)的字節(jié)狀態(tài)一樣,在所有的處理器上,Windows C <br />E均支持。 <br /> 幾乎象所有的數(shù)據(jù)庫引擎一樣,Raima數(shù)據(jù)庫管理器在數(shù)據(jù)庫文件中以二進(jìn)制形式保 <br />存數(shù)字?jǐn)?shù)據(jù)。這就意味一個記錄無論何時寫入數(shù)據(jù)庫或從數(shù)據(jù)庫讀出,均被當(dāng)作一系列 <br />的字節(jié)來處理,不管它域的內(nèi)容。只要數(shù)據(jù)庫文件不要傳給別的任何系統(tǒng),數(shù)字?jǐn)?shù)據(jù)的 <br />字節(jié)狀態(tài)問題就解決了。如果數(shù)據(jù)庫文件被一個來自原始系統(tǒng)且?guī)в胁煌止?jié)狀態(tài)的處 <br />理器訪問,數(shù)字?jǐn)?shù)據(jù)將被誤解。 <br /> 無論何時,當(dāng)你在擁有不同處理器的機(jī)器上傳輸文件時,就會出現(xiàn)這個問題。在這 <br />個問題上,值得高興的是所有類型的處理器都使用相同的字節(jié)狀態(tài)。 <br /> 在使用Windows CE時,這10點(diǎn)忠告應(yīng)該引起你足夠的重視,避免學(xué)習(xí)時走彎路。 <br /> <br /> <br />-- <br /> <br />※ 來源:·BBS 水木清華站 smth.org·[FROM: 202.120.8.76] <br /><a href="00000028.htm">上一篇</a><a href="javascript:history.go(-1)">返回上一頁</a><a href="index.htm">回到目錄</a><a href="#top">回到頁首</a><a href="00000030.htm">下一篇</a></h1></center><center><h1>BBS 水木清華站∶精華區(qū)</h1></center></body></html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -