国产强伦姧在线观看无码,中文字幕99久久亚洲精品,国产精品乱码在线观看,色桃花亚洲天堂视频久久,日韩精品无码观看视频免费

      您現(xiàn)在的位置:智能制造網(wǎng)>技術(shù)中心>Microsoft Windows CE 編程的十點(diǎn)忠告

      直播推薦

      更多>

      企業(yè)動(dòng)態(tài)

      更多>

      推薦展會(huì)

      更多>

      Microsoft Windows CE 編程的十點(diǎn)忠告

      2009年05月21日 19:54:35人氣:742來(lái)源:煙臺(tái)勾股通信技術(shù)有限公司




      zui近兩周我們花了大部分時(shí)間將已有的應(yīng)用程序移植到Microsoft Windows CE中。一般說(shuō)來(lái),這個(gè)計(jì)劃不是太難。我們起步于Microsoft Win32代碼,當(dāng)然 Windows CE是基于Win32應(yīng)用程序接口(API)的。有利的是,我們的應(yīng)用程序(即Raima 數(shù)據(jù)管理器)有方便的使用接口,并包含一個(gè)大約由150個(gè)子函數(shù)組成的庫(kù),這些函數(shù)都是由C語(yǔ)言寫成,可以用來(lái)創(chuàng)建、管理和訪問(wèn)數(shù)據(jù)庫(kù)。
        按建立應(yīng)用程序的方式來(lái)說(shuō),我們?cè)詾閷⑺浦驳絎indows CE中是一項(xiàng)相對(duì)簡(jiǎn)單的C語(yǔ)言編程練習(xí)。然而,我們不久便遇到好些困難。從粗心大意的錯(cuò)誤開始,比如在基于Windows NT 的Windows CE仿真器上使用Microsoft Windows NT庫(kù),接著又違背Windows CE的編程戒律,如"千萬(wàn)不要給Unicode(標(biāo)準(zhǔn)組織10646標(biāo)準(zhǔn))字符分配奇數(shù)內(nèi)存地址"。
        大約有百分之九十的問(wèn)題或多或少地與Unicode有關(guān)。盡管Unicode編程不難,但是,當(dāng)給單字節(jié)字符編寫代碼時(shí),很容易出錯(cuò)(我有過(guò)許多次錯(cuò)誤)。
        下面這些忠告是根據(jù)我們?cè)赪indows CE上編寫Raima 數(shù)據(jù)管理器的經(jīng)驗(yàn)總結(jié)出來(lái)的,但我相信,在做任何其它Windows CE程序之前,它們都值得借鑒。畢竟大多數(shù)Windows,當(dāng)他們創(chuàng)建*個(gè)Windows CE應(yīng)用程序時(shí),真正運(yùn)用的是已掌握的Win32知識(shí)。
      1. 不要在仿真器上使用Windows NT庫(kù)
        這里所討論的*個(gè)錯(cuò)誤實(shí)在太愚蠢了,但我還是陷了進(jìn)去,也許你也會(huì)。當(dāng)用Microsoft VC++(5.0版)創(chuàng)建一個(gè)Windows CE程序時(shí),你會(huì)發(fā)現(xiàn),包含路徑(include)、 庫(kù)路徑(library)、及可執(zhí)行程序路徑被自動(dòng)調(diào)整以匹配反應(yīng)目標(biāo)環(huán)境的選擇。因此,比如說(shuō)為Windows CE模擬器建立應(yīng)用程序時(shí),你會(huì)發(fā)現(xiàn),include路徑?jīng)]有指向Win32的包含文件(在VC目錄下),而是指向Windows CE包含文件(在WCE目錄下)。千萬(wàn)別去修改。
        由于Windows CE在Windows NT下運(yùn)行,所以仿真器上運(yùn)行的程序能夠調(diào)用任一Windows NT動(dòng)態(tài)鏈接庫(kù)(DLL)中的函數(shù),即使這個(gè)DLL不是模擬器的成員也一樣。顯然,這不是很好的事,因?yàn)橄嗤暮瘮?shù)也許在手持PC(H/PC)或Windows CE設(shè)備上不可用,而你的軟件zui終要能在這些設(shè)備上運(yùn)行。
        *次將非Unicode應(yīng)用程序裝入Windows CE仿真器時(shí),你會(huì)發(fā)現(xiàn),許多正在使用的函數(shù)它都不支持,例如美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)定義的字符函數(shù)strcpy()。這也許引誘你去鏈接Windows NT 運(yùn)行時(shí)間庫(kù),以便能解決所有問(wèn)題。
        如果你是剛開始用Windows CE編程,可能你能用的包含文件和庫(kù)文件是明顯的。答案就是,你不要采用那些在寫普通Win32或非Windows CE程序時(shí)使用的包含文件和庫(kù)文件。
      2. 不要混淆TCHARs和bytes
        如果你正在Windows CE上寫非Unicode應(yīng)用程序,你或許要將所有的字符串從單個(gè)字符(chars)轉(zhuǎn)換為寬字符(widechars)(例如,C變量類型whcar_t)。幾乎所有Windows CE支持的Win32和運(yùn)行時(shí)間庫(kù)函數(shù)都要求寬字符變量。Windows 95不支持Unicode,然而,為了使程序代碼具有可移植性,你要盡可能采用tchar.h中定義的TCHAR類型,不要直接使用wchar_t。
        TCHAR是定義為wchar_t還是char,取決于預(yù)處理器的符號(hào)UNICODE是否定義。同樣,所有有關(guān)字符串處理函數(shù)的宏,如_tcsncpy宏,它是定義為Unicode函數(shù)wcsncpy還是定義為ANSI函數(shù)strncpy,取決于UNICODE是否定義。
        在現(xiàn)存的Windows應(yīng)用程序中,有些代碼也許暗示字符長(zhǎng)為單字節(jié)。這在給字符串分配內(nèi)存時(shí)經(jīng)常用到,例如:
      int myfunc(char *p)
      {
      char *pszFileName;
      pszFileName = malloc(MAXFILELEN);
      if(pszFileName)
      strncpy(pszFileName, p, MAXFILELEN);
      /*etc*/
        在這段代碼中,分配的內(nèi)存塊應(yīng)該寫作(MAXFILELEN * sizeof(char)),但是大多數(shù)程序員喜歡將它簡(jiǎn)化為MAXFILELEN,因?yàn)閷?duì)于所有的平臺(tái)來(lái)說(shuō)sizeof(char)的值等于1。然而,當(dāng)你用TCHARS代替多個(gè)字符時(shí),很容易忘記這種固有的概念,于是將代碼編寫成下面的形式:
      int myfunc(TCHAR *p)
      {
      TCHAR *pszFileName;
      PszFileName = (TCHAR*)malloc(MAXFILELEN);
      If (pszFileName)
      tcsncpy(pszFileName, p, MAXFILELEN);
      /*etc*/
        這是不行的。它馬上會(huì)導(dǎo)致出錯(cuò)。這里的錯(cuò)誤在于malloc函數(shù)中變量大小為bytes,然而_tcsncpy函數(shù)中使用的第三個(gè)變量卻為TCHARs而不是bytes。當(dāng)UNICODE被定義時(shí),一個(gè)TCHAR等于兩個(gè)字節(jié)數(shù)(bytes)。
      上述代碼段應(yīng)該改寫為:
      int myfunc(TCHAR *p)
      {
      TCHAR *pszFileName;
      PszFileName = (TCHAR*)malloc(MAXFILELEN * sizeof(TCHAR));
      if(pszFileName)
      tcsncpy(pszFileName, p, MAXFILELEN);
      /*etc*/
      3. 不要將Unicode 字符串放入奇數(shù)內(nèi)存地址
        在In系列處理器上,你可以在一奇數(shù)內(nèi)存地址儲(chǔ)存任何變量或數(shù)組,不會(huì)導(dǎo)致任何致命的錯(cuò)誤影響。但在H/PC上,這一點(diǎn)不一定能行 ? 你必須對(duì)大于一個(gè)字節(jié)的數(shù)據(jù)類型小心謹(jǐn)慎,包括定義為無(wú)符號(hào)短型(unsigned short) 的wchar_t。當(dāng)你設(shè)法訪問(wèn)它們的時(shí)候,將它們置于奇地址會(huì)導(dǎo)致溢出。
        編輯器經(jīng)常在這些問(wèn)題上提醒你。你無(wú)法管理堆棧變量地址,并且編輯器會(huì)檢查確定這些地址與變量類型是否相匹配。同樣,運(yùn)行時(shí)間庫(kù)必須保證從堆中分配的內(nèi)存總是滿足一個(gè)word邊界 ,所以你一般不必?fù)?dān)心那兩點(diǎn)。但是,如果應(yīng)用程序含有用memcpy()函數(shù)拷貝內(nèi)存區(qū)域的代碼,或者使用了某種類型的指針?biāo)阈g(shù)以確定內(nèi)存地址,問(wèn)題也許就出現(xiàn)了??紤]下面的例子:
      int send_name (TCHAR * pszName)
      {
      char *p, *q;
      int nLen=(_tcslen(pszName) + 1) * sizeof(TCHAR);
      p=maloc(HEADER_SIZE + nLen);
      if(p)
      {
      q = p + HEADER_SIZE;
      _tcscpy((TCHAR*)q, pszName);
      }
      /* etc */
        這段代碼是從堆中分配內(nèi)存并復(fù)制一個(gè)字符串,在字符串的開頭留一個(gè)HEADER_SIZE的大小。假設(shè)UNICODE定義了,那么該字符串就是一個(gè)widechar字符串。如果HEADER_SIZE是一個(gè)偶數(shù),這段代碼就會(huì)正常工作,但如果HEADER_SIZE為奇數(shù),這段代碼就會(huì)出錯(cuò),因?yàn)閝指向的地址也將為奇數(shù)。
        注意,當(dāng)你在In系列處理器中的Windows CE仿真器上測(cè)試這段代碼時(shí),這個(gè)問(wèn)題是不會(huì)發(fā)生的。
        在這個(gè)例子中,只要確保HEADER_SIZE為偶數(shù),你就可以避免問(wèn)題的發(fā)生。然而,在某些情況下你也許不能這么做。例如,如果程序是從一臺(tái)式PC輸入數(shù)據(jù),你也許不得不采用事先定義過(guò)的二進(jìn)制格式,盡管它對(duì)H/PC不適合。在這種情況下,你必須采用函數(shù),這些函數(shù)用字符指針控制字符串而不是TCHAR指針。如果你知道字符串的長(zhǎng)度,就可以用memcpy()復(fù)制字符串。因此,采用逐個(gè)字節(jié)分析Unicode字符串的函數(shù)也許足以確定字符串在widechars中的長(zhǎng)度。
      4. 在ANSI和Unicode字符串之間進(jìn)行翻譯
        如果你的Windows CE應(yīng)用程序接口于臺(tái)式PC,也許你必須操作PC機(jī)中的ANSI字符串?dāng)?shù)據(jù)(例如,char字符串)。即使你在程序中只用到Unicode字符串,這都是事實(shí)。
        你不能在Windows CE上處理一個(gè)ANSI字符串,因?yàn)闆](méi)有操縱它們的庫(kù)函數(shù)。的解決辦法是將ANSI字符串轉(zhuǎn)換成Unicode字符串用到H/PC上,然后再將Unicode字符串轉(zhuǎn)換回ANSI字符串用到PC上。為了完成這些轉(zhuǎn)換,可采用MultiByteToWideChar()和WideCharToMultiByte () Win32 API 函數(shù)。
      5. 對(duì)于Windows CE 1.0的字符串轉(zhuǎn)換,劈開(hack)
        在Windows CE 1.0 版本中,這些Win32API函數(shù)還沒(méi)有完成。所以如果你想既要支持CE 1.0又能支持CE 2.0,就必須采用其它函數(shù)。將ANSI字符串轉(zhuǎn)換成Unicode字符串可以用wsprintf(),其中*個(gè)參數(shù)采用一widechar字符串,并且認(rèn)識(shí)"%S"(大寫),意思是一個(gè)字符串。由于沒(méi)有wsscanf() 和 wsprintfA(),你必須想別的辦法將Unicode字符串轉(zhuǎn)換回ANSI字符串。由于Windows CE 1.0不在國(guó)家語(yǔ)言支持(NLS)中,你也許得求助于hack,如下所示:
      /*
      Definition / prototypes of conversion functions
      Multi-Byte (ANSI) to WideChar (Unicode)
      atow() converts from ANSI to widechar
      wtoa() converts from widechar to ANSI
      */
      #If ( _WIN32_WCE ####= 101)
      #define atow(strA, strW, lenW)
      MultiByteToWidechar (CP_ACP, 0, strA, -1, strW, lenW)
      #define wtoa(strW, strA, lenA)
      WideCharToMutiByte (CP_ACP, 0, strW, -1, strA, lenA, NULL, NULL)
      #Else /* _WIN32_WCE ####= 101)*/
      /*
      MultiByteToWideChar () and WideCharToMultiByte() not supported on Windows CE 1.0
      */
      int atow(char *strA, wchar_t *strW, int lenW);
      int wtoa(wchar_t *strW, char *strA, int lenA);
      endif /* _WIN32_WCE ####= 101*/
      #If (_WIN32_WCE ||||101)
      int atow(char *strA, wchar_t *strW, int lenW)
      {
      int len;
      char *pA;
      wchar_t *pW;
      /*
      Start with len=1, not len=0, as string length returned
      must include null terminator, as in MultiByteToWideChar()
      */
      for(pA=strA, pW=strW, len=1; lenW; pA++, pW++, lenW--, len++)
      {
      *pW = (lenW = =1) ? 0 : (wchar_t)( *pA);
      if( ! (*pW))
      break;
      }
      return len;
      }
      int wtoa(har_t *strW, char *strA, int lenA)
      {
      int len;
      char *pA;
      wchar_t *pW;
      /*
      Start with len=1,not len=0, as string length returned
      Must include null terminator, as in WideCharToMultiByte()
      */
      for(pA=strA, pW=strW, len=1; lenA; pa++, pW++, lenA--, len++)
      {
      pA = (len==1)? 0 : (char)(pW);
      if(!(*pA))
      break;
      }
      return len;
      }
      #Endif /*_WIN32_WCE||||101*/
        這種適合于Windows CE 1.0的實(shí)現(xiàn)辦法比使用wsprintf()函數(shù)要容易,因?yàn)槭褂脀sprintf()函數(shù)更難以限制目標(biāo)指針?biāo)赶虻淖址拈L(zhǎng)度。
      6. 選擇正確的字符串比較函數(shù)
        如果你要分類Unicode標(biāo)準(zhǔn)字符串,你會(huì)有以下幾個(gè)函數(shù)可供選擇:
      wcscmp(), wcsncmp(), wcsicmp(), 和wcsnicmp()
      wcscoll(), wcsncoll(), wcsicoll(),和wcsnicoll()
      CompareString()
        *類函數(shù)可用來(lái)對(duì)字符串進(jìn)行比較,不參考當(dāng)?shù)兀↙ocale)或外文字符。如果你永遠(yuǎn)不想支持外文,或者你僅僅想測(cè)試一下兩個(gè)字符串的內(nèi)容是否相同,這類函數(shù)非常好用。
        第二類函數(shù)使用現(xiàn)有的當(dāng)?shù)卦O(shè)置(current locale settings)(系統(tǒng)設(shè)置,除非你在字符串比較函數(shù)之前調(diào)用了wsetlocale()函數(shù))來(lái)比較兩個(gè)字符串。這些函數(shù)也能正確分類外文字符。如果當(dāng)?shù)氐淖?quot;C"("C" locale)被選定,這些函數(shù)與*類函數(shù)就具有了相同的功能。
        第三類函數(shù)是Win32函數(shù)CompareString()。這個(gè)函數(shù)類似于第二類函數(shù),但是它允許你當(dāng)?shù)卦O(shè)置(the locale)作為一個(gè)參數(shù),而不是使用現(xiàn)有的當(dāng)?shù)卦O(shè)置(current locale settings)。CompareString()函數(shù)允許你選擇性地兩個(gè)字符串的長(zhǎng)度。你可以將第二個(gè)參數(shù)設(shè)置為NORM_IGNORECASE,從而使函數(shù)比較字符串時(shí)不比較大小寫。
        通常,即使不將第二個(gè)參數(shù)設(shè)置為NORM_IGNORECASE,CompareString()函數(shù)也不用來(lái)區(qū)分大小寫。我們經(jīng)常用wcsncoll()函數(shù)來(lái)區(qū)分大小寫,除非使用當(dāng)?shù)氐淖址?C"("C" locale)。所以,在我們的代碼中,不使用CompareString()函數(shù)來(lái)區(qū)分大小寫,而用wcsncoll()函數(shù)來(lái)區(qū)分大小寫
      7. 不要使用相對(duì)路徑
        與Windows NT不一樣,Windows CE沒(méi)有當(dāng)前目錄這個(gè)概念,因此,任何路徑只是相對(duì)于根目錄而言的。如果你的軟件給文件或目錄使用相對(duì)路徑,那么你很可能把它們移到別的地方了。例如,路徑".abc"在Windows CE中被當(dāng)作"abc"看待。
      8.移走了對(duì)calloc()和 time()函數(shù)的調(diào)用
        C運(yùn)行庫(kù)中的calloc()函數(shù)不能使用,但是malloc()函數(shù)可以代替calloc()函數(shù)。并且不要忘記,calloc()函數(shù)初始化時(shí)分配的內(nèi)存為零,而malloc()函數(shù)不一樣。同樣,time()函數(shù)也不能使用,但你可以使用Win32函數(shù)GetSystemTime()函數(shù)代替time()函數(shù)。
        經(jīng)過(guò)以上的警告后,你會(huì)高興地學(xué)習(xí)zui后令你驚訝的兩點(diǎn)忠告。
      9. 不需要改變Win32 輸入/輸出(I/O)文件的調(diào)用
        Win32的輸入輸出函數(shù),Windows CE也支持。允許你象訪問(wèn)Win32文件系統(tǒng)那樣訪問(wèn)對(duì)象。CreateFile()函數(shù)在Windows CE中不能辯認(rèn)標(biāo)志FILE_FLAG_RANDOM_ACCESS,但是這個(gè)標(biāo)志僅用作可選的磁盤訪問(wèn),并且不影響函數(shù)調(diào)用的功能。
      10. 不要擔(dān)心字節(jié)的狀態(tài)
        當(dāng)我們把應(yīng)用程序?qū)懭隬indows CE時(shí),有了一個(gè)美好的發(fā)現(xiàn),那就是Windows CE的數(shù)字?jǐn)?shù)據(jù)類型的字節(jié)狀態(tài)與In結(jié)構(gòu)的字節(jié)狀態(tài)一樣,在所有的處理器上,Windows CE均支持。
        幾乎象所有的數(shù)據(jù)庫(kù)引擎一樣,Raima數(shù)據(jù)庫(kù)管理器在數(shù)據(jù)庫(kù)文件中以二進(jìn)制形式保存數(shù)字?jǐn)?shù)據(jù)。這就意味一個(gè)記錄無(wú)論何時(shí)寫入數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)讀出,均被當(dāng)作一系列的字節(jié)來(lái)處理,不管它域的內(nèi)容。只要數(shù)據(jù)庫(kù)文件不要傳給別的任何系統(tǒng),數(shù)字?jǐn)?shù)據(jù)的字節(jié)狀態(tài)問(wèn)題就解決了。如果數(shù)據(jù)庫(kù)文件被一個(gè)來(lái)自原始系統(tǒng)且?guī)в胁煌止?jié)狀態(tài)的處理器訪問(wèn),數(shù)字?jǐn)?shù)據(jù)將被誤解。
        無(wú)論何時(shí),當(dāng)你在擁有不同處理器的機(jī)器上傳輸文件時(shí),就會(huì)出現(xiàn)這個(gè)問(wèn)題。在這個(gè)問(wèn)題上,值得高興的是所有類型的處理器都使用相同的字節(jié)狀態(tài)。
        在使用Windows CE時(shí),這10點(diǎn)忠告應(yīng)該引起你足夠的重視,避免學(xué)習(xí)時(shí)走彎路。
      關(guān)鍵詞:處理器
      全年征稿/資訊合作 聯(lián)系郵箱:1271141964@qq.com

      免責(zé)聲明

      • 凡本網(wǎng)注明"來(lái)源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請(qǐng)必須注明智能制造網(wǎng),http://www.towegas.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
      • 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
      • 本網(wǎng)轉(zhuǎn)載并注明自其它來(lái)源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品來(lái)源,并自負(fù)版權(quán)等法律責(zé)任。
      • 如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

      <
      更多 >

      工控網(wǎng)機(jī)器人儀器儀表物聯(lián)網(wǎng)3D打印工業(yè)軟件金屬加工機(jī)械包裝機(jī)械印刷機(jī)械農(nóng)業(yè)機(jī)械食品加工設(shè)備制藥設(shè)備倉(cāng)儲(chǔ)物流環(huán)保設(shè)備造紙機(jī)械工程機(jī)械紡織機(jī)械化工設(shè)備電子加工設(shè)備水泥設(shè)備海洋水利裝備礦冶設(shè)備新能源設(shè)備服裝機(jī)械印染機(jī)械制鞋機(jī)械玻璃機(jī)械陶瓷設(shè)備橡塑設(shè)備船舶設(shè)備電子元器件電氣設(shè)備


      我要投稿
      • 投稿請(qǐng)發(fā)送郵件至:(郵件標(biāo)題請(qǐng)備注“投稿”)1271141964.qq.com
      • 聯(lián)系電話0571-89719789
      工業(yè)4.0時(shí)代智能制造領(lǐng)域“互聯(lián)網(wǎng)+”服務(wù)平臺(tái)
      智能制造網(wǎng)APP

      功能豐富 實(shí)時(shí)交流

      智能制造網(wǎng)小程序

      訂閱獲取更多服務(wù)

      微信公眾號(hào)

      關(guān)注我們

      抖音

      智能制造網(wǎng)

      抖音號(hào):gkzhan

      打開抖音 搜索頁(yè)掃一掃

      視頻號(hào)

      智能制造網(wǎng)

      公眾號(hào):智能制造網(wǎng)

      打開微信掃碼關(guān)注視頻號(hào)

      快手

      智能制造網(wǎng)

      快手ID:gkzhan2006

      打開快手 掃一掃關(guān)注
      意見反饋
      關(guān)閉
      企業(yè)未開通此功能
      詳詢客服 : 0571-87858618