?? 123.txt
字號(hào):
本書(shū)假設(shè)讀者了解C和熟悉微軟Windows,在XP下用微軟嵌入式Visual C++開(kāi)發(fā)過(guò)本地程序。為了編譯書(shū)中的例子程序,需要微軟嵌入式Visual C++ 4.0,這可以在附書(shū)光盤(pán)中找到。需要相關(guān)的適合Windows CE設(shè)備的SDK,用于你的目標(biāo)設(shè)備。
每個(gè)例子已經(jīng)有一個(gè)預(yù)先定義好的工程設(shè)置,但你也可以選擇從頭創(chuàng)建一個(gè)工程。對(duì)大多數(shù)例子來(lái)說(shuō),簡(jiǎn)單創(chuàng)建一個(gè)普通WCE應(yīng)用程序工程就可以了。對(duì)于那些要求訪問(wèn)Pocket PC上特殊功能的例子,即使整個(gè)工程設(shè)置不是特別為Pocket PC應(yīng)用定義的,也可以用特殊的代碼鏈接這些功能。
對(duì)那些想為Pocket PC 2000和2002寫(xiě)應(yīng)用程序的開(kāi)發(fā)者來(lái)說(shuō),需要使用 嵌入式Visual C++ 3.0。不幸的是,附書(shū)光盤(pán)沒(méi)有足夠的空間同時(shí)放eVC3和eVC4,但你可以從微軟網(wǎng)站下載eVC3。還需要用于這些老版本Pocket PC系統(tǒng)的SDK。一些例子,例如藍(lán)牙、OBEX和服務(wù)等例子,使用了老系統(tǒng)里沒(méi)有的例子。
用Visual Studio.NET 2003可以開(kāi)發(fā).NET精簡(jiǎn)框架應(yīng)用程序。因?yàn)樘蠛头敲赓M(fèi),所以沒(méi)有在光盤(pán)里提供。當(dāng)然,這個(gè)工具是非常高效的開(kāi)發(fā)工具。那些對(duì)開(kāi)發(fā)可管理代碼感興趣的人來(lái)說(shuō),開(kāi)發(fā)效率提高減輕了升級(jí)花費(fèi)所帶來(lái)的痛苦。在精簡(jiǎn)框架這一章,你需要Visual Studio.NET 2003來(lái)編譯里面的例子。該工具為所有的Pocket PC設(shè)備以及基于Windows CE 4.1以上的嵌入式版本提供了必要的運(yùn)行時(shí)庫(kù)。
目標(biāo)系統(tǒng)
你并不需要Windows CE目標(biāo)設(shè)備來(lái)體驗(yàn)書(shū)中提供的例子。各種SDK平臺(tái)都帶有Windows CE模擬器,讓你可以在Windows XP對(duì)Windows CE程序下執(zhí)行基本測(cè)試。在你手邊沒(méi)有實(shí)際的設(shè)備的時(shí)候,可以很方便地使用模擬器。模擬器執(zhí)行PC模擬器中的Windows CE版本,而PC模擬器會(huì)在PC上執(zhí)行一個(gè)實(shí)際的Windows CE操作系統(tǒng)。
在決定使用哪種Windows CE硬件來(lái)測(cè)試的時(shí)候,你應(yīng)該考慮很多因素。首先,如果應(yīng)用程序式一個(gè)商業(yè)產(chǎn)品,你至少應(yīng)該為每種目標(biāo)CPU購(gòu)買(mǎi)一個(gè)系統(tǒng)。你需要在所有目標(biāo)CPU上進(jìn)行測(cè)試,因?yàn)殡m然源代碼可能相同,但執(zhí)行結(jié)果可能不同,并且每種目標(biāo)CPU分配的內(nèi)存大小也不同。
其它資源
雖然我試圖將本書(shū)做成“一站式”的Windows CE編程書(shū)籍,但沒(méi)有一本書(shū)可以覆蓋各個(gè)方面的。通常,要了解更多Windows編程知識(shí),我推薦經(jīng)典書(shū)籍--Charles Petzold寫(xiě)的Windows編程(微軟出版社,1998)一書(shū)。這是迄今為止最好的Windows編程書(shū)籍。Charles提供了例子,演示如何解決困難而又常見(jiàn)的Windows問(wèn)題。要更多的了解Win32 核心API,我推薦Jeff Richter的《Windows 核心編程》(Programming Applications for Microsoft Windows (Microsoft Press, 1999))。Jeff揭示了進(jìn)程、線程和內(nèi)存管理方面的很多細(xì)節(jié)技術(shù)。要了解更多的MFC編程知識(shí),沒(méi)有比Jeff Prosise的《MFC程序設(shè)計(jì)》( Programming Windows with MFC (Microsoft Press, 1999). )更好的書(shū)籍了。這本書(shū)是MFC版的Petzold編程書(shū)籍,可以說(shuō)是MFC程序員必讀。
要更多的了解.NET編程,我推薦Charles Petzold的《C# Windows 程序設(shè)計(jì)》(Programming Windows with C# (Microsoft Press, 2002))。Charles 將他令人驚嘆的技巧應(yīng)用到了.NET框架的Windows Form中。這是趕上.NET客戶端編程發(fā)展速度的一本非常的好書(shū)。
概述
從經(jīng)典的《The C Programming Language》一書(shū)開(kāi)始,傳統(tǒng)上編程方面的書(shū)都是從"Hello,world"程序開(kāi)始的。這是一個(gè)合理恰當(dāng)?shù)拈_(kāi)始。每個(gè)程序都有一個(gè)基本底層結(jié)構(gòu),分析它可以揭示所有運(yùn)行在這個(gè)操作系統(tǒng)上的應(yīng)用程序都具有的基礎(chǔ),避一些設(shè)計(jì)復(fù)雜的任務(wù)將結(jié)構(gòu)搞的難以理解。
在本書(shū)"Hello,world"一章里,包含了關(guān)于設(shè)置和使用編程環(huán)境的細(xì)節(jié)。用于開(kāi)發(fā)微軟Windows CE應(yīng)用程序的環(huán)境與開(kāi)發(fā)標(biāo)準(zhǔn)微軟Windows 應(yīng)用程序的環(huán)境有些不同,因?yàn)閃indows CE程序是在運(yùn)行XP的PC機(jī)器上編寫(xiě),卻主要在獨(dú)立的基于Windows CE的目標(biāo)機(jī)器上進(jìn)行調(diào)試的。
經(jīng)驗(yàn)豐富的Windows程序員可能會(huì)跳過(guò)這一章進(jìn)入有更多內(nèi)容的主題,但我建議你至少瀏覽一下本章,了解標(biāo)準(zhǔn)Windows 編程和Windows CE編程之間的區(qū)別。兩個(gè)開(kāi)發(fā)過(guò)程中許多細(xì)微而又重要的不同之處和Windows CE應(yīng)用程序的基本構(gòu)架包含在第一章里。
Windows CE有什么不同之處
Windows CE有許多特性使得它不同于其它Windows 平臺(tái)。首先,運(yùn)行Windows CE的系統(tǒng),大多數(shù)可能不使用Intel x86兼容微處理器。實(shí)際上,Windows CE運(yùn)行在4種不同的CPU系列里:SHx, MIPS, ARM, 和 x86。幸運(yùn)的是,開(kāi)發(fā)環(huán)境幾乎將各種不同CPU的所有差異與程序員隔離開(kāi)了。
Windows CE程序事先不能確定屏幕或鍵盤(pán)。Pocket PC設(shè)備有一個(gè)240*320的縱向屏幕,而其它系統(tǒng)具有傳統(tǒng)的480*240,640*240,640*480像素分辨率的橫向屏幕。一些嵌入式設(shè)備則根本沒(méi)有顯示器。一些目標(biāo)設(shè)備可能不支持彩色,并且大部分Windows CE設(shè)備用觸摸屏替代了鼠標(biāo)。一些在觸摸屏設(shè)備上,輕觸屏幕,表示鼠標(biāo)左鍵點(diǎn)擊,沒(méi)有明顯的方法代表鼠標(biāo)右鍵。為了能處理右鍵,Windows 約定,當(dāng)輕觸屏幕的時(shí)候,按下Alt鍵,由Windows CE程序把這個(gè)組合序列解釋為鼠標(biāo)右鍵點(diǎn)擊。
Windows CE設(shè)備具有更少的資源
運(yùn)行Windows CE系統(tǒng)的目標(biāo)設(shè)備上,各種資源變化極大。當(dāng)寫(xiě)一個(gè)標(biāo)準(zhǔn)Windows 程序的時(shí)候,程序員可以對(duì)目標(biāo)設(shè)備做許多假定,并且設(shè)備幾乎都是IBM兼容機(jī)。目標(biāo)設(shè)備通常有硬盤(pán)用于存儲(chǔ),同時(shí)虛擬內(nèi)存系統(tǒng)用硬盤(pán)作為交換設(shè)備來(lái)模擬一個(gè)幾乎沒(méi)有數(shù)量限制的虛擬內(nèi)存。程序員知道用戶有鍵盤(pán)、雙鍵鼠標(biāo)以及可以當(dāng)前支持256色、至少有800*600分辨率的顯示器。
Windows CE程序所運(yùn)行的設(shè)備幾乎都沒(méi)有硬盤(pán)作為大容量存儲(chǔ)。沒(méi)有硬盤(pán)不僅僅意味著沒(méi)有地方存儲(chǔ)大量文件,也意味著不能交換數(shù)據(jù)到磁盤(pán)上來(lái)創(chuàng)建虛擬內(nèi)存。所以Windows CE程序幾乎總是在少量?jī)?nèi)存環(huán)境里運(yùn)行的。因?yàn)橘Y源缺乏,內(nèi)存分配經(jīng)常失敗。當(dāng)空閑內(nèi)存達(dá)到一個(gè)嚴(yán)重低的級(jí)別,Windows CE可能會(huì)自動(dòng)終止一個(gè)程序。RAM的限制對(duì)Windows CE程序有很大的影響,并且是將現(xiàn)有的Windows應(yīng)用程序移植到Windows CE過(guò)程涉及的主要挑戰(zhàn)之一。
Unicode
在寫(xiě)Windows CE程序時(shí),程序員可以使用的一個(gè)特性是Unicode. Unicode是一個(gè)字符編碼標(biāo)準(zhǔn),使用16位表示一個(gè)字符,相對(duì)的,ASCII標(biāo)準(zhǔn)是用單個(gè)8位編碼一個(gè)字符。Unicode 允許相當(dāng)簡(jiǎn)單將程序移植到不同的國(guó)際市場(chǎng),因?yàn)槭澜缟纤幸阎淖址伎梢杂?5,536個(gè)Unicode 值里的一個(gè)來(lái)表示。處理Unicode相對(duì)容易,只要避免假設(shè)字符串是用ASCII代表和字符是按單個(gè)字節(jié)存儲(chǔ)的。
使用Unicode的一個(gè)結(jié)果是每個(gè)字符占2個(gè)字節(jié)而不是一個(gè),字符串長(zhǎng)了一倍。程序員必須小心計(jì)算緩沖區(qū)和字符串的長(zhǎng)度。你不能再假設(shè)260字節(jié)可以存儲(chǔ)259個(gè)字符和一個(gè)0結(jié)尾符。作為標(biāo)準(zhǔn)char數(shù)據(jù)類(lèi)型的替代品,你應(yīng)該使用TCHAR數(shù)據(jù)類(lèi)型。TCHAR在MS Windows 95和98中定義為char型,在Windows 2000,XP,Windows CE中,使用Unicode功能的程序里,TCHAR定義為unsigned short類(lèi)型。這些類(lèi)型定義,允許在基于ASCII和Unicode的操作系統(tǒng)上源代碼級(jí)的兼容。
新控件
Windows CE上有許多為特殊環(huán)境設(shè)計(jì)的新控件。包括命令條、菜單條控件,提供類(lèi)似菜單和工具條的功能,在具有更小屏幕的Windows CE設(shè)備上,這些為了節(jié)省空間都合并一行里。其它控件也為Windows CE做了改進(jìn)。Windows CE里的編輯控件(edit control)可以設(shè)置為自動(dòng)將單詞首字母大寫(xiě),這對(duì)在無(wú)鍵盤(pán)的PDA上進(jìn)行設(shè)計(jì)是很重要的。對(duì)于Windows 桌面版本里的控件,Windows CE則提供了大部分。例如,日期和時(shí)間調(diào)整控件、日歷控件使日歷和管理器應(yīng)用程序更加適合諸如H/PC和Pocket PC等手持設(shè)備。其它Windows標(biāo)準(zhǔn)控件做了功能裁減,這反應(yīng)了Windows CE特殊的硬件系統(tǒng)配置所具有的緊湊簡(jiǎn)潔特性。
組件化
Windows CE編程中另一個(gè)需要注意的方面是Windows CE可以被微軟或OEM廠商分解和重新配置,以更好地適應(yīng)目標(biāo)市場(chǎng)或設(shè)備。Windows程序員通常只是檢查Windows 版本,看是否是Windows 95/98,Me系列或者2000,XP系列。通過(guò)獲得版本,程序員可以判斷哪些API函數(shù)可以使用。然而,Windows CE可以按無(wú)數(shù)種方式配置。
迄今為止,Windows CE最流行的配置是Pocket PC。微軟定義了具體Windows CE組件集合,這些都體現(xiàn)在所有稱(chēng)為Pocket PC的設(shè)備上。然而,一些用Windows CE生產(chǎn)的OEM產(chǎn)品--PDA設(shè)備,并不叫Pocket PC。這些設(shè)備同Pocket PC設(shè)備在API上略微不同。如果你沒(méi)有意識(shí)到這一點(diǎn),你很容易寫(xiě)一個(gè)程序能運(yùn)行在一個(gè)平臺(tái),卻不能運(yùn)行在另一個(gè)平臺(tái)。在嵌入式平臺(tái)上,OEM廠商決定包括什么組件,并可以為它特定的平臺(tái)創(chuàng)建一個(gè)SDK開(kāi)發(fā)包。如果OEM廠商對(duì)第三方開(kāi)發(fā)感興趣,它會(huì)為它的設(shè)備提供一個(gè)可定制的SDK包。新的平臺(tái)不斷出現(xiàn),它們有許多共同的地方,也有許多不同之處。程序員需要了解目標(biāo)平臺(tái),在嘗試用一個(gè)可能不被設(shè)備支持的功能集時(shí),需要讓程序檢查在特殊平臺(tái)上什么函數(shù)可用。
Win32子集
最后,因?yàn)閃indows CE比XP小很多,它不能像它大塊頭的兄弟XP那樣支持所有的函數(shù)調(diào)用。當(dāng)你面對(duì)一個(gè)不支持打印功能的操作系統(tǒng),比如原始模式下的Windows CE時(shí),不要調(diào)用任何打印函數(shù),Windows CE還去除了一些XP中支持的冗余功能。雖然Windows CE可能不支持你喜歡的功能,但其它不同的函數(shù)集可能會(huì)工作的很好。有時(shí)Windows CE編程似乎主要是用Windows CE中稀少的API來(lái)找出實(shí)現(xiàn)一個(gè)特性的方式,雖然成千上萬(wàn)的函數(shù)很少被調(diào)用。
依然是Windows編程
雖然Windows CE和Windows的其它版本之間確實(shí)存在差異,但不應(yīng)該夸大這種差異。編寫(xiě)Windows CE應(yīng)用程序依然是編寫(xiě)Windows應(yīng)用程序。
有同樣的消息循環(huán),同樣的窗口,大部分情況下,具有同樣的資源和控件。差異并不會(huì)掩蓋相同的地方。匈牙利命名方式是重要的相同點(diǎn)之一。
匈牙利命名方法
自從Charles Petzold寫(xiě)《Windows 程序設(shè)計(jì)》一書(shū)開(kāi)始,大部分Windows程序都采用了匈牙利命名方法,這是一種傳統(tǒng)和良好的命名方法。這種編程風(fēng)格是Charles Simonyi多年前在微軟發(fā)明的,它給程序里每個(gè)變量用1到2個(gè)字母的前綴來(lái)表示變量的類(lèi)型。例如,命名為Name的字符串?dāng)?shù)組應(yīng)該命名為szName,前綴sz表示變量類(lèi)型是以0做終止符的字符串。匈牙利命名法的價(jià)值在于極大的提高了源程序的可讀性。其它的程序員,或者你看一段代碼,不應(yīng)該重復(fù)的看變量聲明來(lái)判定變量的類(lèi)型。表1-1列出了變量典型的匈牙利前綴。
表1-1 變量的匈牙利前綴
變量類(lèi)型 匈牙利前綴
Integer i or n
Word (16-bit) w or s
Double word (32-bit unsigned) Dw
Long (32-bit signed) L
Char C
String Sz
Pointer P
Long pointer lp
Handle h
Window handle hwnd
Struct size cb
你可以看到Windows早期的一些痕跡。lp或者長(zhǎng)指針,在Intel 16位編程模式下,指針?lè)治欢讨羔槪?6位偏移)和長(zhǎng)指針(附加偏移段)。其它前綴由類(lèi)型的縮寫(xiě)構(gòu)成。例如,刷子的句柄通常是hbr。前綴可以是組合的,就像lpsz,指出一個(gè)以0結(jié)尾的長(zhǎng)指針。Windows API中大部分結(jié)構(gòu)是采用匈牙利表示法來(lái)給它們的域命名的。本書(shū)通篇使用這種命名法。我鼓勵(lì)你在你的程序里用這種命名方法。
第一個(gè)Windows CE程序
說(shuō)了這么多,就讓我們一起看一下你的第一個(gè)Windows CE程序吧。列表1-1顯示了Hello1--為Windows CE寫(xiě)的一個(gè)簡(jiǎn)單的Hello World應(yīng)用程序。
Listing 1-1: Hello1, 一個(gè)簡(jiǎn)單的Windows應(yīng)用程序
Hello1.cpp
//======================================================================
// Hello1 - A simple application for Windows CE
//
// Written for the book Programming Windows CE
// Copyright (C) 2003 Douglas Boling
//======================================================================
#include "windows.h"
//
// Program entry point
//
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR lpCmdLine, int nCmdShow) {
printf ("Hello World\n");
return 0;
}
如您所見(jiàn),除了程序入口點(diǎn)外,代碼看上去十分類(lèi)似經(jīng)典的Kernighan和Ritchie版程序。在注釋之后,有一行代碼
#include "windows.h"
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -