?? 00000029.htm
字號:
數據(例如,char字符串)。即使你在程序中只用到Unicode字符串,這都是事實。 <br /> 你不能在Windows CE上處理一個ANSI字符串,因為沒有操縱它們的庫函數。最好的 <br />解決辦法是將ANSI字符串轉換成Unicode字符串用到H/PC上,然后再將Unicode字符串轉 <br />換回ANSI字符串用到PC上。為了完成這些轉換,可采用MultiByteToWideChar()和WideC <br />harToMultiByte () Win32 API 函數。 <br />5. 對于Windows CE 1.0的字符串轉換,劈開(hack) <br /> 在Windows CE 1.0 版本中,這些Win32API函數還沒有完成。所以如果你想既要支持 <br />CE 1.0又能支持CE 2.0,就必須采用其它函數。將ANSI字符串轉換成Unicode字符串可以 <br />用wsprintf(),其中第一個參數采用一widechar字符串,并且認識"%S"(大寫),意思是 <br />一個字符串。由于沒有wsscanf() 和 wsprintfA(),你必須想別的辦法將Unicode字符串 <br />轉換回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的實現辦法比使用wsprintf()函數要容易,因為使用ws <br />printf()函數更難以限制目標指針所指向的字符串的長度。 <br />6. 選擇正確的字符串比較函數 <br /> 如果你要分類Unicode標準字符串,你會有以下幾個函數可供選擇: <br />wcscmp(), wcsncmp(), wcsicmp(), 和wcsnicmp() <br />wcscoll(), wcsncoll(), wcsicoll(),和wcsnicoll() <br />CompareString() <br /> 第一類函數可用來對字符串進行比較,不參考當地(Locale)或外文字符。如果你 <br />永遠不想支持外文,或者你僅僅想測試一下兩個字符串的內容是否相同,這類函數非常 <br />好用。 <br /> 第二類函數使用現有的當地設置(current locale settings)(系統設置,除非你在 <br />字符串比較函數之前調用了wsetlocale()函數)來比較兩個字符串。這些函數也能正確 <br />分類外文字符。如果當地的字符"C"("C" locale)被選定,這些函數與第一類函數就具 <br />有了相同的功能。 <br /> 第三類函數是Win32函數CompareString()。這個函數類似于第二類函數,但是它允 <br />許你指定當地設置(the locale)作為一個參數,而不是使用現有的當地設置(current <br /> locale settings)。CompareString()函數允許你選擇性地指定兩個字符串的長度。你 <br />可以將第二個參數設置為NORM_IGNORECASE,從而使函數比較字符串時不比較大小寫。 <br /> 通常,即使不將第二個參數設置為NORM_IGNORECASE,CompareString()函數也不用 <br />來區分大小寫。我們經常用wcsncoll()函數來區分大小寫,除非使用當地的字符"C"(" <br />C" locale)。所以,在我們的代碼中,不使用CompareString()函數來區分大小寫,而 <br />用wcsncoll()函數來區分大小寫 <br />7. 不要使用相對路徑 <br /> 與Windows NT不一樣,Windows CE沒有當前目錄這個概念,因此,任何路徑只是相 <br />對于根目錄而言的。如果你的軟件給文件或目錄使用相對路徑,那么你很可能把它們移 <br />到別的地方了。例如,路徑".\abc"在Windows CE中被當作"\abc"看待。 <br />8.移走了對calloc()和 time()函數的調用 <br /> C運行庫中的calloc()函數不能使用,但是malloc()函數可以代替calloc()函數。并 <br />且不要忘記,calloc()函數初始化時分配的內存為零,而malloc()函數不一樣。同樣, <br />time()函數也不能使用,但你可以使用Win32函數GetSystemTime()函數代替time()函數 <br />。 <br /> 經過以上的警告后,你會高興地學習最后令你驚訝的兩點忠告。 <br />9. 不需要改變Win32 輸入/輸出(I/O)文件的調用 <br /> Win32的輸入輸出函數,Windows CE也支持。允許你象訪問Win32文件系統那樣訪問 <br />對象。CreateFile()函數在Windows CE中不能辯認標志FILE_FLAG_RANDOM_ACCESS,但是 <br />這個標志僅用作可選的磁盤訪問,并且不影響函數調用的功能。 <br />10. 不要擔心字節的狀態 <br /> 當我們把應用程序寫入Windows CE時,有了一個美好的發現,那就是Windows CE的 <br />數字數據類型的字節狀態與Intel結構的字節狀態一樣,在所有的處理器上,Windows C <br />E均支持。 <br /> 幾乎象所有的數據庫引擎一樣,Raima數據庫管理器在數據庫文件中以二進制形式保 <br />存數字數據。這就意味一個記錄無論何時寫入數據庫或從數據庫讀出,均被當作一系列 <br />的字節來處理,不管它域的內容。只要數據庫文件不要傳給別的任何系統,數字數據的 <br />字節狀態問題就解決了。如果數據庫文件被一個來自原始系統且帶有不同字節狀態的處 <br />理器訪問,數字數據將被誤解。 <br /> 無論何時,當你在擁有不同處理器的機器上傳輸文件時,就會出現這個問題。在這 <br />個問題上,值得高興的是所有類型的處理器都使用相同的字節狀態。 <br /> 在使用Windows CE時,這10點忠告應該引起你足夠的重視,避免學習時走彎路。 <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 水木清華站∶精華區</h1></center></body></html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -