版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第7章WindowsCE應(yīng)用程序設(shè)計7.1WindowsCE應(yīng)用程序開發(fā)簡介7.2WindowsCE系統(tǒng)的開發(fā)工具7.3WindowsCE應(yīng)用程序開發(fā)流程7.4WindowsCE應(yīng)用程序接口7.5開發(fā)WindowsCE應(yīng)用程序的注意事項7.6基于VS2005的應(yīng)用程序開發(fā)簡例7.7本章小結(jié)
在WindowsCE下,應(yīng)用程序開發(fā)(ApplicationDevelopment)是針對驅(qū)動和內(nèi)核而言的。應(yīng)用程序開發(fā)是指針對給定的WindowsCE平臺,利用該平臺提供的編程接口(API),使用特定工具(如VisualStudio.NET2003、eMbeddedVisualC++或PlatformBuilder5.0),實現(xiàn)特定功能的程序設(shè)計活動。7.1WindowsCE應(yīng)用程序開發(fā)簡介這里需要指出的是,對于特定的平臺,結(jié)合圖7.1所示的WindowsCE體系結(jié)構(gòu),可知應(yīng)用程序處于整個WindowsCE體系結(jié)構(gòu)的最上層,應(yīng)用程序直接與操作系統(tǒng)交互。因為WindowsCE是一個可高度定制的操作系統(tǒng),因此基于WindowsCE平臺提供的API可能會不同。
圖7.1WindowsCE體系結(jié)構(gòu)對于WindowsCE的編程接口,在WindowsCE設(shè)計之初,微軟就決定對桌面Windows和WindowsCE采用幾乎一樣的編程接口。這樣做一方面可使Windows下的應(yīng)用開發(fā)人員快速、平滑地過渡到WindowsCE平臺下,另一方面有利于大量現(xiàn)有的桌面Windows下的應(yīng)用程序移植到WindowsCE平臺下。而平臺的價值是依賴于運行在其上的應(yīng)用程序的,這也是我們選擇WindowsCE平臺的主要原因。
為了使讀者能對WindowsCE系統(tǒng)的開發(fā)有一個全面而快速的了解,下面將對WindowsCE系統(tǒng)的開發(fā)內(nèi)容、開發(fā)工具、開發(fā)流程與開發(fā)方法進(jìn)行介紹。
WindowsCE系統(tǒng)開發(fā)本質(zhì)上屬于嵌入式系統(tǒng)開發(fā),而嵌入式系統(tǒng)是由硬件和軟件組成的,所以一個完整的WindowsCE系統(tǒng)開發(fā)也是由硬件開發(fā)和軟件開發(fā)兩部分組成的。WindowsCE是一個嵌入式操作系統(tǒng),它本身是軟件,但它必須在特定的硬件上面才能運行,BootLoader、OAL、驅(qū)動程序等操作系統(tǒng)軟件都直接與硬件打交道,而絕大多數(shù)應(yīng)用程序則不直接與硬件打交道。
本章的主要內(nèi)容是介紹與WindowsCE有關(guān)的軟件開發(fā),并將與WindowsCE相關(guān)的軟件開發(fā)劃分為與硬件直接相關(guān)的軟件開發(fā)、與硬件間接相關(guān)的軟件開發(fā)和與硬件無關(guān)的純軟件開發(fā)。其中,應(yīng)用程序的開發(fā)是本章講述的重點。表7.1給出了WindowsCE系統(tǒng)的開發(fā)內(nèi)容。
表7.1WindowsCE系統(tǒng)的開發(fā)內(nèi)容應(yīng)用程序開發(fā)是WindowsCE系統(tǒng)開發(fā)最重要的部分,但對于開發(fā)者來說也是難度最小的部分。一個嵌入式系統(tǒng)或嵌入式產(chǎn)品之所以區(qū)別于其他嵌入式系統(tǒng)或者產(chǎn)品,其關(guān)鍵就在于其應(yīng)用的不同,兩個不同的嵌入式系統(tǒng)或者嵌入式產(chǎn)品,它們的硬件可以完全相同,操作系統(tǒng)定制也可以完全相同,但其應(yīng)用絕對應(yīng)該不同。應(yīng)用程序開發(fā)多數(shù)情況下是與硬件無關(guān)的純軟件開發(fā),對開發(fā)者來說沒有硬件方面的水平要求,與BSP開發(fā)相比,難度自然降低了很多。隨著所要開發(fā)的嵌入式系統(tǒng)或嵌入式產(chǎn)品的不同,所要開發(fā)的應(yīng)用程序也多種多樣,開發(fā)者既可以開發(fā)沒有任何顯示界面的通信程序,也可以開發(fā)具有完整Windows界面的圖形應(yīng)用程序,開發(fā)什么樣的程序完全取決于應(yīng)用的需要。微軟為開發(fā)者提供了豐富的WindowsCE應(yīng)用程序開發(fā)工具,使開發(fā)者既可以使用C/C++語言開發(fā)本地(Native)應(yīng)用程序,也可以使用C#.NET或VisualBasic.NET語言開發(fā)托管的(Managed)應(yīng)用程序。
7.2.1WindowsCE系統(tǒng)的開發(fā)工具概要
從WindowsCE1.0開始,微軟就為在WindowsCE下開發(fā)應(yīng)用程序提供了完備的操作系統(tǒng)開發(fā)工具和應(yīng)用程序開發(fā)工具,并隨著系統(tǒng)版本的不斷升級,開發(fā)工具也不斷升級和完善,功能越來越強(qiáng)大,易用性越來越好。7.2WindowsCE系統(tǒng)的開發(fā)工具在WindowsCE4.X上,微軟為應(yīng)用程序的開發(fā)人員提供了三種開發(fā)工具:VisualStudio.NET2003用來開發(fā)基于.NETCompactFramework的托管C++代碼;eMbeddedVisualC++和PlatformBuilder4.X用來開發(fā)本機(jī)代碼;此外,還有EmbeddedVisualTools3.0(不提倡,已被廢棄,這里不做討論)。
在WindowsCE5.X中,仍可使用PlatformBuilder5.X進(jìn)行應(yīng)用程序的開發(fā),最大的變化是eMbeddedVisualC++的作用已經(jīng)被VisualStudio2005替代。VisualStudio2005既可用來開發(fā)基于.NETCompactFramework2.X的托管代碼,也可以用來開發(fā)本機(jī)代碼。因為PlatformBuilder的最大作用是用來定制內(nèi)核,所以應(yīng)用程序開發(fā)完全可通過VisualStudio2005完成。隨著最新的WindowseMbeddedCE6.0的逐步推廣應(yīng)用,未來將是VisualStudio2005或其后續(xù)版本一統(tǒng)天下。因而WindowsCE的產(chǎn)品線就更加明晰了:純應(yīng)用程序開發(fā)采用VisualStudio;內(nèi)核定制采用PlatformBuilder。WindowsCE.net下的應(yīng)用開發(fā)模型如圖7.2所示。
圖7.2WindowsCE5.X下的應(yīng)用開發(fā)模型本書中會涉及3種應(yīng)用程序的開發(fā)工具:eMbeddedVisualC++、VisualStudio2005和PlatformBuilder。表7.2對WindowsCE5.X之后的WindowsCE操作系統(tǒng)開發(fā)工具和應(yīng)用程序開發(fā)工具進(jìn)行了總結(jié)。
表7.2WindowsCE開發(fā)工具總結(jié)在介紹每種開發(fā)工具的功能和使用方法之前,首先須意識到這些軟件在安裝過程中其實是有先后順序的,即各軟件之間存在著相互依賴的關(guān)系,否則安裝過程中會導(dǎo)致出錯或者無法安裝。圖7.3描述了各軟件之間的相互依賴關(guān)系。其中,虛線代表部分依賴,實線代表全部依賴,依賴關(guān)系從下至上。
圖7.3各軟件之間的依賴關(guān)系7.2.2使用EVC開發(fā)應(yīng)用程序
eMbeddedVisualC++(簡稱EVC)是專門用來開發(fā)基于WindowsCE的本機(jī)應(yīng)用程序的工具。由于嵌入式系統(tǒng)資源有限,因此選用效率高、性能好、編譯出的應(yīng)用程序結(jié)構(gòu)緊湊的C++作為編譯器。EVC的最新版本為4.0,可為WindowsCE4.X和WindowsCE5.X開發(fā)應(yīng)用程序。
從此工具的名字上就可以看出,eMbeddedVisualC++和桌面VisualC++關(guān)系密切。的確,它與VisualC++6.0(簡稱VC6.0)具有相似的工程管理模式和用戶界面,連一些快捷鍵都是一樣的。熟悉VC6.0的讀者可很快上手。eMbeddedVisualC++4.0集成開發(fā)環(huán)境如圖7.4所示。
圖7.4eMbeddedVisualC++4.0集成開發(fā)環(huán)境從圖7.4中可以看出,eMbeddedVisualC++支持WinCEApp/DLL/COM/Lib使用Win32API、MFC、ATL和STL,并且與桌面VisualC++的功能基本相同。這也是WindowsCE嵌入式操作系統(tǒng)占據(jù)優(yōu)勢并迅速成功的重要條件。所以如果熟悉Windows環(huán)境下的編程,再掌握WindowsCE編程的特點,很快就會進(jìn)入WindowsCE編程的世界。對于開發(fā)人員來說,EVC易于調(diào)試和測試,當(dāng)然,如果想要開發(fā)相應(yīng)的應(yīng)用程序,則至少需要安裝一個SDK,默認(rèn)eMbeddedVisualC++
會帶有微軟提供的StandardSDK。7.2.3使用VisualStudio2005開發(fā)應(yīng)用程序
VisualStudio2005是微軟于2005年推出的集成開發(fā)環(huán)境,是VisualStudio.NET2003的后續(xù)產(chǎn)品。對于嵌入式開發(fā)者來說,VisualStudio2005與VisualStudio.NET2003最大的區(qū)別是增加了本機(jī)代碼的開發(fā),以及對
.NETCompactFramework2.0的支持。因此,如果希望在WindowsCE下開發(fā)應(yīng)用程序,那么建議使用VisualStudio2005。VisualStudio中的“新建項目”對話框如圖7.5所示。在VisualStudio2005中,IDE強(qiáng)化了對圖形界面設(shè)計的支持。開發(fā)人員可以所見即所得的方式設(shè)計PocketPC和Smartphone的應(yīng)用程序,這樣避免了以前在IDE中無法知道目標(biāo)設(shè)備的確切分辨率而導(dǎo)致的圖形界面問題。
在VisualStudio2005中,所有的WindowsCE模擬器都是基于ARMV4體系結(jié)構(gòu)的。這對于開發(fā)PocketPC和Smartphone的應(yīng)用程序來說有非常重要的意義,因為現(xiàn)在市場上所有的PocketPC和Smartphone設(shè)備的CPU都是清一色的ARM處理器。這樣,在模擬器下運行的代碼,無須重新編譯,即可在真實的PocketPC和Smartphone上運行。
圖7.5VisualStudio中的“新建項目”對話框7.2.4使用PlatformBuilder開發(fā)應(yīng)用程序
PlatformBuilder(PB)是微軟為開發(fā)人員進(jìn)行基于WindowsCE平臺的嵌入式操作系統(tǒng)的開發(fā)而定制的集成開發(fā)環(huán)境。在WindowsCE6.0操作系統(tǒng)開發(fā)和應(yīng)用開發(fā)都統(tǒng)一到了VS2005環(huán)境。PlatformBuilder提供了所有進(jìn)行設(shè)計、創(chuàng)建、編譯、測試和調(diào)試WindowsCE操作系統(tǒng)平臺的工具。它運行在桌面Windows下,開發(fā)人員可以通過交互式的環(huán)境來設(shè)計和定制內(nèi)核、選擇系統(tǒng)特性,然后進(jìn)行編譯和調(diào)試。同時,開發(fā)人員還可以利用PlatformBuilder6.0來進(jìn)行驅(qū)動程序開發(fā)和應(yīng)用程序項目開發(fā),等等。PlatformBuilder6.0的強(qiáng)大功能,已使其成為WindowsCE平臺下嵌入式操作系統(tǒng)開發(fā)和定制的必備工具。在PlatformBuilder中選擇File→NewProjectorFile命令可打開“新建項目”對話框,如圖7.6所示。
圖7.6“新建項目”對話框使用PlatformBuilder的優(yōu)點是顯而易見的:它支持WinCEApp/DLL/Lib,使用Win32API開發(fā),應(yīng)用程序?qū)⒈绘溄拥絆S內(nèi)核中,這樣做的好處是容易調(diào)試OS內(nèi)核,可以把應(yīng)用程序直接集成到操作系統(tǒng)映像中,使應(yīng)用程序與操作系統(tǒng)一起發(fā)布,這樣就避免了應(yīng)用程序的安裝部署。但是同時也帶來了一些問題:
(1)一旦修改了代碼,必須重新編譯鏡像。
(2)上述做法雖然容易調(diào)試OS內(nèi)核,但是卻不容易調(diào)試應(yīng)用程序。主要表現(xiàn)在首先必須創(chuàng)建一個debug版的OS,然后才能DebugZone。7.2.5各種開發(fā)工具的比較
至此,已經(jīng)詳細(xì)介紹了4種應(yīng)用程序的開發(fā)工具:eMbeddedVisualC++、VisualStudio.NET2003、VisualStudio2005和PlatformBuilder。至于如何選擇開發(fā)工具,可以參考表7.3。
表7.3幾種開發(fā)工具對比一般來說,使用eMbeddedVisualC++
開發(fā)本機(jī)碼。當(dāng)效能和控制是應(yīng)用程序的最大需求時,開發(fā)工程師應(yīng)使用EmbeddedVisualC++
開發(fā)本機(jī)碼應(yīng)用程序。選擇本機(jī)碼或是托管代碼來開發(fā)應(yīng)用程序,牽涉到的選擇非常廣泛,還包括開發(fā)工具、平臺支持、應(yīng)用程序需求及應(yīng)用領(lǐng)域、開發(fā)者習(xí)慣、共享及時效性等。
WindowsCE系統(tǒng)的開發(fā)大致可以分為三個階段:硬件開發(fā)階段、操作系統(tǒng)開發(fā)階段和應(yīng)用程序開發(fā)階段。硬件開發(fā)階段的開發(fā)包括硬件設(shè)計開發(fā)、BootLoader開發(fā)、OAL開發(fā)和BSP開發(fā);操作系統(tǒng)設(shè)計階段的開發(fā)包括開發(fā)定制驅(qū)動、創(chuàng)建最小內(nèi)核、定制操作系統(tǒng)組件以及測試與集成等;應(yīng)用程序開發(fā)階段的主要任務(wù)是開發(fā)特定的應(yīng)用程序及中間件。WindowsCE系統(tǒng)的開發(fā)流程如圖7.7所示。7.3WindowsCE應(yīng)用程序開發(fā)流程
圖7.7WindowsCE下應(yīng)用程序開發(fā)流程在WindowsCE下開發(fā)應(yīng)用程序也可劃分為3個步驟:
(1)獲得特定WindowsCE平臺的SDK;
(2)在WindowsCE模擬器上編輯和調(diào)試代碼;
(3)在實際目標(biāo)平臺上編譯和運行程序,如果需要在設(shè)備上調(diào)試程序,可以通過ActiveSync進(jìn)行。7.3.1安裝SDK
大多數(shù)應(yīng)用程序開發(fā)者會選用VisualStudio2005或者EVC開發(fā)應(yīng)用程序,如果是這樣,那么安裝合適的SDK是第一步工作。SDK(SoftwareDevelopmentKit)是一系列頭文件、庫文件、文檔、平臺管理器和運行時庫的總稱。開發(fā)人員可使用SDK為某個特定的平臺開發(fā)應(yīng)用程序。
使用VisualC++為桌面Windows開發(fā)應(yīng)用程序同樣須安裝SDK,微軟也會在自己的網(wǎng)站上提供最新的開發(fā)桌面應(yīng)用程序的SDK(稱為PlatformSDK)供用戶下載。但是絕大多數(shù)桌面Windows開發(fā)人員卻對此一無所知。主要原因有兩個:第一,桌面Windows是不可定制的。桌面Windows中包含的組建和功能模塊相對固定,因此桌面Windows的SDK內(nèi)容也就相對固定,我們幾乎可使用同一套PlatformSDK為所有桌面Windows開發(fā)應(yīng)用程序。第二,PlatformSDK已經(jīng)被集成到了VisualC++
中。在安裝VisualC++時,開發(fā)人員可能并不知道PlatformSDK也同時被安裝。
WindowsCE不能像桌面Windows一樣,有一個統(tǒng)一的SDK。WindowsCE是一個可以定制、裁剪的操作系統(tǒng),每一個WindowsCE平臺包含的功能都不盡相同,因此每個平臺向應(yīng)用程序提供的API集合都不相同。
VisualStudio和eMbeddedVisualC++
都依賴特定的SDK開發(fā)應(yīng)用程序,只有安裝了特定的SDK后,在開發(fā)工具的“新建項目向?qū)А敝胁艜邢鄳?yīng)的選項。在eMbeddedVisualC++中,提供了PlatformManager來管理已經(jīng)安裝的SDK,從菜單Tools→ConfigurePlatformManager…命令可打開“PlatformManager”對話框,如圖7.8所示。
圖7.8EVC環(huán)境中的QQ2440SDK在VisualStudio中,可從菜單Tools→Options→DevicesTools→Devices中查看已經(jīng)安裝的SDK,如圖7.9所示。
有些讀者可能注意到,在安裝開發(fā)工具時,默認(rèn)會安裝一個稱做“StandardSDK”的SDK。前面已經(jīng)介紹過,由于WindowsCE操作系統(tǒng)的特性,不可能存在“標(biāo)準(zhǔn)”的SDK。所謂StandardSDK,只不過是微軟把WindowsCE中最常用的一些功能取出來作為一個“標(biāo)準(zhǔn)”的SDK,使用StandardSDK開發(fā)的應(yīng)用程序,可在大多數(shù)WindowsCE平臺上運行。但是StandardSDK也并不是萬能的,例如,StandardSDK不支持中文和DirectX等。
圖7.9VisualStudio環(huán)境中的QQ2440SDK應(yīng)用開發(fā)人員可由兩種途徑獲得SDK:
(1)從微軟或者第三方處獲得SDK;
(2)通過PlatformBuilder導(dǎo)出自己的SDK。
如果開發(fā)人員希望該平臺可擴(kuò)展,其他應(yīng)用可在該平臺運行,則基本原則是誰建誰就負(fù)責(zé)提供,即誰構(gòu)建了該WindowsCE平臺,誰就應(yīng)該負(fù)責(zé)提供該平臺的SDK。當(dāng)然,有些平臺是沒有必要擴(kuò)展的,也就沒有必要為它提供SDK。典型的代表是便攜式視頻播放器(PortableMediaCenter)。如果應(yīng)用程序所運行的平臺不是由自己構(gòu)建的,而是由第三方提供的,那么第三方應(yīng)該負(fù)責(zé)提供該平臺上網(wǎng)SDK。PocketPC和Smartphone是這類平臺的典型代表。微軟構(gòu)建了基于WindowsCE的PocketPC和Smartphone平臺,自然應(yīng)該由微軟提供PocketPC和Smartphone的SDK。
如果應(yīng)用程序所運行的平臺是由自己構(gòu)建的,那么開發(fā)人員可通過PlatformBuilder的導(dǎo)出SDK功能創(chuàng)建自己的SDK,被導(dǎo)出的SDK由頭文件、庫文件、運行文件、平臺的外延和幫助文件等組成。應(yīng)用程序開發(fā)人員可以利用這個SDK去關(guān)聯(lián)MicrosoftembeddedVisualC++4.0或MicrosoftVisualStudio.NET,為特定平臺開發(fā)應(yīng)用,也可把導(dǎo)出的SDK發(fā)布給其他用戶安裝。PB、SDK和開發(fā)工具之間的關(guān)系如圖7.10所示。
圖7.10PB、SDK和開發(fā)工具之間的關(guān)系7.3.2代碼編寫和調(diào)試
1.代碼編寫
在安裝好合適的SDK后,就可通過WindowsCE中的開發(fā)應(yīng)用程序的工具eMbeddedVisualC++
或VisualStudio編寫應(yīng)用程序了。編碼過程與桌面Windows應(yīng)用程序開發(fā)沒有太大的區(qū)別。在編碼的過程中要明白兩個概念:本機(jī)碼和托管碼。
(1)本機(jī)碼。一般來說,使用eMbeddedVisualC++開發(fā)的應(yīng)用程序代碼又稱為本機(jī)碼(NativeCode)。本機(jī)碼應(yīng)用程序使用一套特定軟件平臺的應(yīng)用程序開發(fā)接口(API)來開發(fā),并且被編譯成一個特定處理器(Microprocessor)的目的碼(ObjectCode)或機(jī)器碼(MachineCode)。一般情況下,本機(jī)碼提供較高的效能(Performance)和最小的資源需求,但是被編譯好的本機(jī)碼或可執(zhí)行文件(Executable)卻只能在此特定軟件平臺和特定處理器上運行。此外,開發(fā)本機(jī)碼應(yīng)用程序常需要應(yīng)用程序開發(fā)者自行處理類似內(nèi)存管理、資源管理、安全性管理等事務(wù),而這些通常必須要由經(jīng)驗豐富的C++應(yīng)用程序開發(fā)工程師來處理。
(2)托管碼。利用VisualStudio.NET的VisualC#.NET或VisualBasic.NET開發(fā)出來的.NETCompactFramework應(yīng)用程序代碼稱為托管代碼(ManagedCode)。托管碼應(yīng)用程序是通過使用一套運行時環(huán)境(Run-timeEnvironment)的應(yīng)用程序開發(fā)接口(API)來開發(fā)的。一般情況下,托管碼應(yīng)用程序的開發(fā)會比較簡單和快速,并且可跨軟件平臺和處理器來運行,所以開發(fā)出的托管碼也能重新使用并有較高的可移植性(Portable)。另外,內(nèi)存管理、資源管理、資源收集(GarbageCollection)、安全性管理等瑣碎的工作都由運行時環(huán)境來處理,應(yīng)用開發(fā)工程師無須費心處理。托管碼應(yīng)用程序在目標(biāo)機(jī)器上運行時,通過目標(biāo)機(jī)器端的實時編譯器(Just-in-TimeCompiler)來實時地把托管代碼編譯成目標(biāo)機(jī)器碼后在目標(biāo)機(jī)器上運行。
2.代碼調(diào)試
在WindowsCE下調(diào)試代碼比較繁瑣。雖然WindowsCE和Windows使用相同的可執(zhí)行PE文件格式,但是WindowsCE下的可執(zhí)行文件是無法直接在桌面Windows中運行的(用.NETCompactFramework為WindowsCE生成的托管代碼可直接在裝有.NETFramework的Windows中運行,但這對于開發(fā)和調(diào)試沒有任何意義)。因此,要調(diào)試WindowsCE下的代碼,有兩種選擇:使用模擬器(Emulator)調(diào)試或者使用WindowsCE設(shè)備調(diào)試。
圖7.11WindowsMobile5.0模擬器
(1)使用模擬器調(diào)試。eMbeddedVisualC++和VisualStudio都帶有WindowsCE的模擬器。模擬器是一個Windows應(yīng)用程序,它在Windows操作系統(tǒng)下為WindowsCE提供了虛擬的硬件執(zhí)行環(huán)境,使WindowsCE可在Windows中作為一個Windows進(jìn)程執(zhí)行。圖7.11所示為WindowsMobile5.0模擬器的界面。
模擬器給開發(fā)人員帶來的最大好處是在一臺機(jī)器上就可完成WindowsCE下的軟件編碼與調(diào)試,而無需WindowsCE硬件設(shè)備,可省去繁瑣的硬件連接與昂貴的硬件設(shè)備。和桌面Windows應(yīng)用開發(fā)一樣,可通過在代碼中設(shè)置斷點以及單步跟蹤代碼等方式進(jìn)行調(diào)試。在WindowsCE5.X之前,WindowsCE的模擬器都是在模擬X86CPU上運行的。WindowsCE5.X中新增加了基于ARMCPU的模擬器。這樣,如果應(yīng)用程序最終運行的平臺是ARM,那么開發(fā)人員就可選用基于ARM的模擬器,進(jìn)一步減小因為模擬器與真實設(shè)備體系結(jié)構(gòu)不同造成的錯誤。
模擬器不但可用來測試代碼,還可方便地訪問Windows中的文件和用來測試定制的WindowsCE操作系統(tǒng)。使用模擬器的優(yōu)點非常明顯,但是模擬器畢竟只是一個虛擬的執(zhí)行環(huán)境,其缺點也是顯而易見的。模擬器只是模擬WindowsCE可運行的部分硬件,因此,與紅外、藍(lán)牙、Wi-Fi、USB及IEEE1394等硬件設(shè)備相關(guān)的應(yīng)用程序無法在模擬器上運行。所以,本書僅僅在應(yīng)用程序開發(fā)部分使用模擬器,其余部分都使用硬件設(shè)備。建議讀者在學(xué)習(xí)WindowsCE時也盡量使用真實硬件,以免產(chǎn)生“模擬器依賴”。
(2)使用WindowsCE設(shè)備調(diào)試。使用基于WindowsCE的設(shè)備調(diào)試類似于傳統(tǒng)的嵌入式開發(fā)調(diào)試。有了開發(fā)機(jī)和目標(biāo)機(jī)的概念,PC機(jī)和WindowsCE設(shè)備就分別充當(dāng)開發(fā)機(jī)和目標(biāo)機(jī)的角色。
這里先向大家介紹一款非常有用的工具ActiveSync。它是由微軟提供的并且可以讓W(xué)indowsCE設(shè)備和桌面Windows的PC機(jī)十分方便地進(jìn)行通信連接,從而實現(xiàn)文件上傳、遠(yuǎn)程調(diào)試等功能。可以說,ActiveSync是桌面Windows與WindowsCE之間的紐帶。ActiveSync的主界面如圖7.12所示。當(dāng)看到圖7.12所示窗口跳出后,可以注意到PC任務(wù)欄右下角的ActiveSync變成了綠色,這說明一切準(zhǔn)備就緒。
圖7.12ActiveSync的主界面在物理層,ActiveSync可通過串口、紅外、USB端口和以太網(wǎng)與WindowsCE設(shè)備進(jìn)行連接。因此,要使用ActiveSync與WindowsCE設(shè)備成功連接,必須確保WindowsCE設(shè)備與PC機(jī)至少有一條可用的串口、USB或以太網(wǎng)連接。
在完成上述連接之后,就可以使用ActiveSync下載編寫的應(yīng)用程序和進(jìn)行代碼調(diào)試。只要能夠在目標(biāo)設(shè)備和開發(fā)機(jī)之間正確地建立連接,通過設(shè)備調(diào)試與通過模擬器調(diào)試的方法就基本一致了。
7.4.1Windows程序設(shè)計基礎(chǔ)
Windows程序設(shè)計是一種事件驅(qū)動的程序設(shè)計模式。在程序提供給用戶的界面中有許多可操作的可視對象。用戶從所有可能的操作中任意選擇,被選擇的操作會產(chǎn)生某些特定的事件,這些事件發(fā)生后的結(jié)果是向程序中的某些對象發(fā)出消息,然后這些對象調(diào)用相應(yīng)的消息處理函數(shù)來完成特定的操作。7.4WindowsCE應(yīng)用程序接口Windows應(yīng)用程序最大的特點就是程序沒有固定的流程,而只是針對某個事件處理有特定的子流程,Windows應(yīng)用程序可以說是由許多這樣的子流程構(gòu)成的。
Windows應(yīng)用程序在本質(zhì)上是面向?qū)ο蟮摹3绦蛱峁┙o用戶界面的可視對象在程序的內(nèi)部一般也看做一個對象,用戶對可視對象的操作通過事件驅(qū)動模式觸發(fā)相應(yīng)的消息處理函數(shù)。程序的運行過程就是用戶的外部操作不斷產(chǎn)生事件,這些事件又不斷被處理的過程。
圖7.13Windows程序工作原理
Windows這種事件驅(qū)動模型的實質(zhì)源于Windows的消息響應(yīng)機(jī)制。在Windows應(yīng)用程序中,事件產(chǎn)生消息,消息對應(yīng)著事件。所謂事件響應(yīng),其實就是對各種消息的響應(yīng)。用戶要操作Windows程序,必須借助鼠標(biāo)或者鍵盤(在WindowsCE中為觸摸筆、按鍵等)等人機(jī)交互工具。Windows系統(tǒng)以特定的頻率捕捉各種消息,當(dāng)捕捉到發(fā)往本應(yīng)用程序的消息時,Windows應(yīng)用程序?qū)⑾鬟f給相關(guān)的消息處理函數(shù)做相應(yīng)的處理。這種等待消息,響應(yīng)消息的操作方式就是Windows特有的處理機(jī)制,稱為消息處理機(jī)制。在Windows系統(tǒng)中,使用者與系統(tǒng)、系統(tǒng)與應(yīng)用程序、應(yīng)用程序之間主要就是采用了這種消息響應(yīng)的處理機(jī)制。Windows程序工作原理如圖7.13所示。7.4.2Win32API
在介紹Win32API之前,有必要了解Windows應(yīng)用程序的兩個概念:句柄(Handle)和Windows消息(Message)。一個句柄是指Windows使用的一個唯一的整數(shù)值,用于標(biāo)識應(yīng)用程序中不同的對象和同一對象的不同實例。諸如一個窗口、圖標(biāo)、菜單、滾動條、輸出設(shè)備或者文件等均有一個對應(yīng)的句柄值。
Windows應(yīng)用程序利用Windows消息(Message)與其他Windows應(yīng)用程序及Windows系統(tǒng)進(jìn)行信息交換。由于Windows應(yīng)用程序是消息或事件驅(qū)動的,因此Windows消息的工作機(jī)制就顯得很重要了。Windows消息由三部分組成:消息號、字參數(shù)(wParam)和長字參數(shù)(lParam)。消息號由事先定義好的消息名標(biāo)識;字參數(shù)(wParam)和長字參數(shù)(lParam)用于提供消息的附加信息,附加信息的含義和具體的消息號的值相關(guān)。在Windows中,消息往往用一個結(jié)構(gòu)體MSG來表示,結(jié)構(gòu)體MSG的定義如下:
TypedefstructtagMSG{//結(jié)構(gòu)體MSG
HWNDhWnd;
UINTmessage;
WPARAMwParem;
LPARAMlParam;
DWORDtime;
POINTpt;
}MSG;其中,定義如下:
hWnd:用以檢索消息的窗口句柄,若此參數(shù)為null,則可檢索所有駐留在消息隊列中的消息;
message:代表一個消息的消息值,每一個Windows消息都有一個消息值,該值由Windows.h頭文件中的宏定義來標(biāo)識;
wParam和lParam:包含有關(guān)消息的附加信息,它隨不同的消息而有所不同;
time:指定消息送至隊列的時間;
pt:指定消息發(fā)送時,屏幕光標(biāo)的位置。pt的數(shù)據(jù)類型POINT是一個結(jié)構(gòu)體。
POINT的定義如下:
TypedefstruvttagPOINT{
LONGx;//點在屏幕上的橫坐標(biāo)
LONGy;//點在屏幕上的縱坐標(biāo)
}POINT;將系統(tǒng)定義的消息進(jìn)行分類,前綴符號經(jīng)常用于消息宏,以識別消息所屬的類。系統(tǒng)定義的消息宏前綴如下:
BM:按鈕控件消息;
CB:組合框控件消息;
DM:默認(rèn)下壓式按鈕控件消息;
EM:編輯控件消息;
LB:列表框控件消息;
SBM:滾動條控件消息;
WM:窗口消息。關(guān)于Windows中各條消息的具體定義可以參考相應(yīng)的幫助文件或者程序設(shè)計參考手冊。
除系統(tǒng)定義消息外,應(yīng)用程序還可以定義其自己的消息,供內(nèi)部應(yīng)用程序和系統(tǒng)內(nèi)其他進(jìn)程通信用。不同類型的Windows消息的取值范圍如表7.4所示。
表7.4不同Windows消息類型的取值范圍為使用戶定義的外部消息在整個系統(tǒng)中保持有效,應(yīng)用程序可以調(diào)用函數(shù)RegisterWindowMessage注冊消息。此函數(shù)保證有效消息值,并防止同一隨機(jī)值被用于兩個或更多進(jìn)程內(nèi)用戶定義的外部消息而產(chǎn)生沖突。
Windows應(yīng)用程序接收以各種形式輸入的消息。這些消息包括鍵盤的當(dāng)前狀態(tài)、光標(biāo)位置、鼠標(biāo)狀態(tài)以及產(chǎn)生消息的時間等。0x07FF系統(tǒng)監(jiān)視著所有的設(shè)備并將輸入的消息放入消息隊列中,隨后將系統(tǒng)隊列中的輸入消息復(fù)制到相應(yīng)的應(yīng)用程序隊列中,應(yīng)用程序的消息循環(huán)便從消息隊列中檢索消息并將每一個消息發(fā)送到相應(yīng)的窗口函數(shù)中。在了解了句柄和Windows的概念之后,我們將進(jìn)一步了解Win32API的功能和特點。
Win32API是微軟32位Windows平臺的應(yīng)用程序接口(ApplicationProgrammingInterface)。微軟所有的32位操作系統(tǒng)平臺都支持統(tǒng)一的API,包括函數(shù)、結(jié)構(gòu)體、消息、宏以及接口等。也就是說,所有在Win32平臺上運行的應(yīng)用程序都會直接或者間接地調(diào)用這些函數(shù)。正是由于Win32API接口的良好定義,所以使用Win32API編寫的應(yīng)用程序可在不同的Windows平臺之間基本實現(xiàn)代碼級的兼容??梢哉f,Win32API是認(rèn)識Windows操作系統(tǒng)的一面鏡子,通過它,用戶可以深入系統(tǒng)地掌握Windows的方方面面。很難想象,一個程序員在沒有掌握Win32API的情況下,能編制出很好的基于Windows的應(yīng)用程序來。
在實際的開發(fā)流程中,可以把許多的Windows下的應(yīng)用程序移植到WindowsCE上,而且所需的工作量遠(yuǎn)小于重新開發(fā)這些程序。將程序移植到WindowsCE的過程中要注意Win32API和WindowsCEAPI之間的不同,具體介紹如下:
WindowsCEAPI是Win32API的一個子集,而且其中部分函數(shù)的功能已經(jīng)精簡。例如對顏色和字體的支持更加有限。
WindowsCEAPI具有對WindowsCE的特定擴(kuò)展功能,其中的一些功能,如觸摸屏(TouchScreen)和通知(Notification)需要設(shè)備在硬件功能上的支持。
對異常處理的使用具有限制。雖然支持Win32的結(jié)構(gòu)化異常處理,WindowsCE卻并不支持C++異常處理。
當(dāng)從PC平臺移植已有的Win32應(yīng)用程序到WindowsCE時,主要的問題通常是找不到合適的WindowsCEAPI來替換原有的Win32API。應(yīng)用程序需要滿足WindowsCEAPI以及目標(biāo)系統(tǒng)功能上的限制。7.4.3MFC
Win32API接口基本上使用C語言描述。使用C語言調(diào)用Win32CEAPI是Windows下最簡單、最直接的編程辦法。但是隨著面向?qū)ο蠹夹g(shù),尤其是C++語言的廣泛使用,Win32API的編程模型受到了面向?qū)ο蠹夹g(shù)的沖擊。為了適應(yīng)Windows下面向?qū)ο蟪绦蛟O(shè)計技術(shù)的要求,微軟推出了MFC(MicrosoftFoundationClasses)。
MFC是一個基于C++語言的面向?qū)ο蟮某绦蛟O(shè)計框架,它是微軟隨VisualC++一起提供的基礎(chǔ)類庫并經(jīng)過優(yōu)化和嚴(yán)格測試,封裝了大量的WindowsSDK函數(shù)和典型Windows應(yīng)用程序的默認(rèn)處理。用戶只需要進(jìn)行較少的編程即可完成開發(fā)任務(wù),從而大幅度提高了程序開發(fā)的效率和速度。MFC提供了大量的基類供程序員使用,常用的有CwinApp、CframeWnd、CMDIFrameWnd、Cview、CDC、Cdocument等。
使用MFC類庫的好處是:一方面,MFC提供了一個標(biāo)準(zhǔn)化的結(jié)構(gòu),這樣開發(fā)人員可從一個較高的起點編程,從而節(jié)省大量的時間;另一方面,它提供了大量的代碼,對程序的控制主要由MFC框架完成,而且MFC也完成了大部分的功能,可預(yù)定義或?qū)崿F(xiàn)許多事件和消息處理等等。MFC框架可由其本身處理事件,無須依賴程序員的代碼,也可調(diào)用程序員的代碼來處理應(yīng)用程序特定的事件。
MFC的優(yōu)越性主要體現(xiàn)在以下幾個方面:
(1)完整地封裝了WindowsAPI函數(shù)。MFC為經(jīng)常使用的WindowsAPI函數(shù)提供支持,包括窗口函數(shù)、消息、控件、菜單、對話框、GDI對象、對象鏈接和多文檔界面等。同時,也提供了具有共性的應(yīng)用程序的支持,如打印、狀態(tài)條、工具條、數(shù)據(jù)支持和OLE支持等。
(2)支持多線程。所有的應(yīng)用至少有一個線程,這個線程由CwinApp類的對象使用,被稱為主線程。為了便于多線程編程,MFC還提供了同步對象類。
(3)
MFC提供了消息自動處理。MFC自動處理每個Windows消息,替代了Switchcase語句。
(4)在同一個程序中可同時使用MFC類和WindowsAPI調(diào)用。
(5)
MFC使用與WindowsAPI相同的命名約定。用戶可根據(jù)類名知道類的功能。
(6)大大減少應(yīng)用程序的編程量。使用MFC創(chuàng)建一個窗口所需的代碼大約只是傳統(tǒng)方法編程的1/3,這可以使程序員只花很少的時間與Windows打交道,把更多精力集中在開發(fā)自己的程序代碼上。為了適應(yīng)嵌入式和WindowsCE的要求,WindowsCE中的MFC對桌面MFC做了一定的改動。WindowsCE中的MFC增加了一些WindowsCE特有的類,如WindowsCE中一個重要的新特性命令條(Command-bar)控制類;同時刪除了對其他一些類的支持。如果應(yīng)用程序是用標(biāo)準(zhǔn)MFC編寫的,需要仔細(xì)檢查應(yīng)用程序所用的類、方法和屬性,并確認(rèn)它們在WindowsCEMFC中是否兼容。至于MFC類庫中的類,其實絕大部分是從基類CObject派生出來的,只有少部分例外。具體內(nèi)容可以參考相關(guān)書籍。7.4.4ATL
活動模板庫(ATL,ActiveXTemplateLibray)是一套C++
模板庫。它是一個基于C++的框架,使用它可以大大簡化組件的開發(fā)過程并提高代碼的效率。ATL同微軟的MFC有異曲同工之處。MFC的存在已經(jīng)有十來個年頭,它已經(jīng)成為了占主導(dǎo)地位的Windows應(yīng)用程序框架。然而在很多情況下,ATL在開發(fā)基于Windows的軟件上已呈現(xiàn)出后來居上的趨勢。尤其是ATL提供了實現(xiàn)基于COM組件內(nèi)核的支持,使得原本被認(rèn)為高不可攀的COM編程變?yōu)楝F(xiàn)實。ATL模板類可以完成一些非常繁瑣的實現(xiàn)細(xì)節(jié)。下面簡單介紹ATL所提供的一些功能。
具有AppWizard工具,其負(fù)責(zé)創(chuàng)建起始的ATL工程。
具有ObjectWizard工具,其為基本的COM組件創(chuàng)建代碼。
對低級別的COM功能的內(nèi)置式支持,如IUnknown、類工廠和自注冊(Self-registration)功能。
支持微軟的接口定義語言(IDL,InterfaceDefinitionLanguage),它提供了對自定義的Vtable接口的調(diào)度(Marshaling)支持,以及通過類型庫進(jìn)行描述(Self-description)的功能。
支持自動化(IDispatch)和雙向接口(DualInterfaces,也稱為雙重接口)。
可以支持開發(fā)效率更高的ActiveX控件。
提供了對基本的視窗功能的支持。
WindowsCE所支持的ATL是桌面Windows中ATL的一個子集。對于ATL的具體使用請參閱相關(guān)書籍。7.4.5.NETCompactFramework
.NETCompactFramework是
.NETFramework的子集,應(yīng)用程序開發(fā)者可以使用相同和熟悉的VisualStudio.NET技術(shù)來開發(fā)WindowsCE.NET裝置的應(yīng)用程序。VisualStudio.NET2003(含)之后的版本支持應(yīng)用程序開發(fā)者在VisualStudio.NET中使用
.NETCompactFramework來開發(fā)和執(zhí)行。開發(fā)環(huán)境對
.NETCompactFramework的支持已經(jīng)由VisualStudio.NET來完成,而WindowsCE.NET裝置也必須支持.NETCompactFramework,以確保使用VisualC#和VisualBasic.NET程序語言開發(fā)的應(yīng)用程序可在裝置上執(zhí)行。
WindowsCE.NET是一個簡潔、可靠、實時和多任務(wù)的嵌入式操作系統(tǒng)。而.NET代表的是它實現(xiàn)(支持)了.NET的技術(shù)。WindowsCE.NET版本的.NET技術(shù),我們把它稱為.NETCompactFramework。顧名思義,Compact表示.NETCompactFramework是.NETFramework的簡潔版。簡單地說,.NETFramework主要由兩大部分組成:CommonLanguageRuntime(公共語言運行時,CLR)和.NETFrameworkclasslibrary。它提供了一個新的應(yīng)用程序運行平臺,一個高度管理的運行平臺。使用者所開發(fā)的.NETFramework應(yīng)用程序在運行時通過.NETFramework的運行平臺展現(xiàn)出該應(yīng)用程序的功能,并且被.NETFramework的運行平臺嚴(yán)格控制管理以減少應(yīng)用程序出錯而導(dǎo)致系統(tǒng)不正常的狀況。另外,.NETFramework也大大地簡化了應(yīng)用程序的開發(fā)和部署,開發(fā)出的應(yīng)用程序是與硬件無關(guān)(HardwareIndependent)的而且可跨機(jī)器平臺執(zhí)行。
.NETCompactFramework目前有1.0和2.0兩個版本。對于平臺來說,WindowsMobile2003中自帶了.NETCompactFramework1.0版本,WindowsMobile5.0附帶了.NETCompactFramework2.0版本;對于開發(fā)工具來說,VisualStudio.NET2003附帶了.NETCompactFramework1.0版本,VisualStudio.NET2005附帶了.NETCompactFramework2.0版本。
下面詳細(xì)介紹.NETCompactFramework的兩個主要組件。
(1)
CommonLanguageRuntime(下文簡稱CLR)可看成是一個運行時(Runtime)或者一個代理(Agent)。它負(fù)責(zé)管理程序代碼的執(zhí)行、管理內(nèi)存(MemoryManagement)、管理線程(ThreadManagement)、轉(zhuǎn)換和類型校驗(TypeChecking)等,以確保系統(tǒng)強(qiáng)固、穩(wěn)定和安全。所以,那些通過CLR運行的應(yīng)用程序或者程序代碼(用.NETCompactFramework、VisualC#.NET或VisualBasic.NET開發(fā)出的應(yīng)用程序)又稱做“被管理的程序代碼”(ManagedCode);反之,那些不需通過CLR運行的應(yīng)用程序或程序代碼(EVC開發(fā)出的應(yīng)用程序)又稱做“不被管理的程序代碼”(UnmanagedCode),或稱做本機(jī)碼或內(nèi)駐碼(NativeCode)。
(2)
.NETCompactFramework類庫。.NETCompactFramework類庫是與公共語言運行時(CLR)緊密集成的可重復(fù)使用類的集合,是提供給開發(fā)者的編程接口。前面我們已經(jīng)說過,.NETCompactFramework只是
.NETFramework的簡潔版,這里的簡潔是指擴(kuò)展的子集。一方面,.NETCompactFramework去掉了一些不適于嵌入式應(yīng)用或者無關(guān)緊要的功能和類;另一方面,.NETCompactFramework中增加了一些特有的類庫支持。要查看.NETCompactFramework是否支持.NETFramework類函數(shù)庫中的某個類或者成員,可在參考技術(shù)文件中查看“Requirements”敘述的“Platforms”中是否列出“.NETCompactFramework”。但要注意的是,技術(shù)文件中所附的范例程序并未在.NETCompactFramework中測試過,有可能完全兼容,可以運行,也有可能需要做小部分修改才能運行。7.4.6接口選擇原則
Win32API、MFC和.NETCompactFramework三種應(yīng)用程序的開發(fā)選擇各有優(yōu)劣。根據(jù)前面介紹的內(nèi)容,讀者應(yīng)該對本機(jī)碼應(yīng)用程序和托管碼應(yīng)用程序有初步的了解。表7.5列出了使用標(biāo)準(zhǔn)Win32API或MFC來開發(fā)本機(jī)碼與使用.NETCompactFramework來開發(fā)托管碼的優(yōu)缺點。對于開發(fā)者來說可以作為參考。
表7.5使用Win32API或MFC來開發(fā)本機(jī)碼與
Win32是操作系統(tǒng)提供的應(yīng)用程序開發(fā)接口,可用來開發(fā)應(yīng)用程序、驅(qū)動程序、控制面板程序和動態(tài)鏈接函數(shù)庫等,并且開發(fā)出來的程序可以有最小的文件大小。因為Win32是操作系統(tǒng)提供的最低階的應(yīng)用程序開發(fā)接口,所以使用Win32開發(fā)應(yīng)用程序需要較長的開發(fā)時間。當(dāng)要開發(fā)驅(qū)動程序、控制面板程序、低階程序代碼或?qū)崟r程序代碼等時,Win32是唯一的選擇。當(dāng)開發(fā)應(yīng)用程序時,除了Win32,還可以使用MFC或.NETCompactFramework。我們可以把一臺WindowsCE裝置看成是由層次化的軟件組成的:最底層是使用Win32本機(jī)碼所開發(fā)出的驅(qū)動程序;最底層上面是由許多個類似數(shù)據(jù)解析(Data-analysis)、DLL和COM組件等的中介層(Middle-tier)程序組成的中間層,該層各部分可用Win32本機(jī)碼、
MFC或ATL來開發(fā);最上層則是提供用戶接口和圖形窗口接口的應(yīng)用程序,這些用戶應(yīng)用程序除了使用Win32、MFC和ATL來開發(fā)外,還可以使用.NETCompactFramework來開發(fā)。
在掌握了以上WindowsCE應(yīng)用程序的開發(fā)工具和方法后,剩下的就是一些對細(xì)節(jié)的把握。在這里要提醒讀者一些在WindowsCE下開發(fā)應(yīng)用程序和一般桌面Windows系統(tǒng)開發(fā)應(yīng)用程序的不同之處和注意事項,如表7.6所示。7.5開發(fā)WindowsCE應(yīng)用程序的注意事項
表7.6開發(fā)應(yīng)用程序的不同之處及注意事項除了上述強(qiáng)調(diào)的部分外,使用eMbeddedVisualC++為WindowsCE開發(fā)應(yīng)用程序和使用VisualC++為一般Windows系統(tǒng)開發(fā)應(yīng)用程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度城市地下綜合管廊電氣設(shè)施建設(shè)合同
- 二零二五年度出租車司機(jī)職業(yè)培訓(xùn)與發(fā)展合作協(xié)議3篇
- 英語思維課程設(shè)計
- 2025版草原生態(tài)保護(hù)合作承包合同樣本3篇
- 2024年電信設(shè)備回收利用合同3篇
- 二零二五年度安裝工程玻璃回收與再利用合同標(biāo)準(zhǔn)范本3篇
- 2024版廚師勞務(wù)合同范本
- 2025年度消防設(shè)施安裝與維修保養(yǎng)合作協(xié)議3篇
- 二零二五年度學(xué)校戒煙指導(dǎo)手冊編寫合同3篇
- 二零二五年度房產(chǎn)權(quán)益繼承與轉(zhuǎn)讓合同3篇
- 北京郵電大學(xué)《數(shù)學(xué)物理方法概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024-2025學(xué)年無錫市數(shù)學(xué)三年級第一學(xué)期期末質(zhì)量檢測試題含解析
- 人教版(2024)數(shù)學(xué)七年級上冊期末測試卷(含答案)
- 醫(yī)院護(hù)理10s管理
- 北京市東城區(qū)2023-2024學(xué)年八年級上學(xué)期期末生物試題
- ISO28000:2022供應(yīng)鏈安全管理體系
- 人教版六年級數(shù)學(xué)下冊全冊分層作業(yè)設(shè)計含答案
- 起重機(jī)設(shè)計手冊
- 超聲波治療儀的臨床應(yīng)用(軟組織損傷篇)
- 汽油調(diào)和技術(shù)
- 105鳳凰佳影后臺用戶手冊(簡潔版)全解
評論
0/150
提交評論