1.88k likes | 2.1k Views
第十五章 Windows CE.NET 应用开发 . §15.1 应用开发概述 §15.2 Windows CE 的应用编程接口 §15.3 Windows CE 应用开发工具 §15.4 eMbedded Visual C++ 4.0 应用开发概述 §15.5 Windows CE 通信开发实例 附录 1 : .NET Compact Framework 开发 附录 2 : WinCE 高级编程 附录 3 :应用程序开发实例. 15.1 应用开发概述. 15.1.1 Windows CE 应用程序开发流程. 开发环境的搭建
E N D
第十五章 Windows CE.NET应用开发 §15.1 应用开发概述 §15.2 Windows CE的应用编程接口 §15.3 Windows CE应用开发工具 §15.4 eMbedded Visual C++ 4.0应用开发概述 §15.5 Windows CE通信开发实例 附录1: .NET Compact Framework开发 附录2: WinCE高级编程 附录3:应用程序开发实例
15.1.1 Windows CE应用程序开发流程 • 开发环境的搭建 • 应用程序代码的编写和调试 • 应用程序的发布
15.1.2 Windows CE编程特性 • CE不能运行现有的桌面应用程序 • 内存管理 • 电源管理 • 用户界面
15.1.3 Windows CE编程基础 • 1. Windows 消息处理机制
2. Unicode • 使用Unicode进行应用程序开发可以满足产品国际化的要求,也可以很容易地在不同语言之间进行数据交换,使开发者能够自由分配支持所有语言的单个二进制.exe文件或.dll文件,同时提高应用程序的运行效率。 • Windows CE规定,所有的字符串必须采用Unicode类型而不是char类型声明,程序中的所有文本文字必须是Unicode字符串,同时,必须为Unicode字符串选择正确的运行库函数。
3. 文件I/O • 与桌面Windows相比较,Windows CE没有当前目录的概念,所有的文件名和路径都必须以“\”开始使用完整的路径名,文件名必须是Unicode。 • 在读写一个文件时,应用程序使用内存映射的I/O代替使用缓冲的I/O。
4. 内存要求 • 基于嵌入式系统的特征,应用程序必须是低内存要求,应用程序必须保存静态变量的大小和数量为最小,必须保持较小的EXE文件,随时检查内存分配的返回值,集中分配应用程序的内存,并且处理WM_HIBERNATE消息。
Windows CE的应用编程接口 • Windows CE .NET 应用程序开发人员目前有三种API可以选择,它们分别是: • Win32 API(应用程序接口) • MFC(微软开发类库)与ATL(活动模板库,它主要用于创建 COM 组件、Web 服务和 Microsoft ActiveX 控件) • Microsoft .NET Framework 精简版。
15.2.1 Win32 API • Win32应用编程接口的目的是提供了一个常用的界面的设置,但不同的平台由于不同的特性及硬件的约束,其部分应用编程接口也不同 • Windows CE.NET API函数从用途上主要分为下列几大类: • 服务性应用、最终用户、核心操作系统服务、通信和网络、文件系统和数据存储、字体、硬件支持、国际化、Internet客户端、多媒体、安全、外壳。
Win32程序模型 • Windows CE的Win32 API具有一些独有的特征: • 它比其他的32位的Windows操作系统的Win32 API要小,它只包括大约相当于Windows NT的半数的API; • 它能够在操作系统的层次,而不是在应用程序的层次上处理通知事件(如时钟); • 触摸屏的API • 对数据库的内置的支持 • 高度的模块化
15.2.2 MFC • MFC是一个基于C++语言的面向对象的程序设计框架,它大大简化了Windows的编程工作 • 同桌面Windows 的MFC库相比较,Windows CE.NET的MFC库在包含的C++类方面有所不同
15.2.3 ATL • Windows CE提供了对ATL的支持,ATL是ActiveX Template Library的缩写,它是一套C++模板库,利用它可以开发出体积更小、速度更快的控件,对于COM组件的开发,它提供了最大限度的代码自动生成以及可视化支持。 • Windows CE所支持的ATL是桌面Windows中ATL的一个子集 • ATL主要在应用层上支持基于COM组件技术的OLE2和 ActiveX
15.2.4 .NET Compact Framework • Win32 函数基本上是分散在一组动态链接库 (DLL) 中,所有函数都被保存在文件、库文件或者DLL当中。要找到某个函数,必须非常清楚包含该函数的文件或者DLL,这是很费劲的一种工作。 • .NET Framework 是一种专门为易于使用而设计的面向对象的 API。.NET API 的用户界面经过了精心设计,是“可发现的”,其目的是:一旦开发者了解了基础知识,就非常容易进行编程。
.NET Compact Framework • Microsoft .NET Framework 精简版(.NET Compact Framework)是一种用于Microsoft Windows CE .NET和Microsoft Windows for Pocket PC的新型应用程序编程接口 (API) • 它为程序员提供了两种编程语言选择: • 一个是Microsoft Visual Basic 的兼容 .NET 的版本,称为 Visual Basic .NET; • 另一个是Microsoft Visual C#,这是专门为 Microsoft .NET 开发的 C 和 C++ 语言家族中的一个新成员。
.NET Compact Framework • 通过Platform Builder,开发者能够为特定目标硬件配置和生成 Windows CE 映像。所有映像都是从以下两种基本配置生成的: • 无头 (HLBASE) 配置 • 基于显示器 (IABASE) 的配置。 • 尽管每种配置都可修改成与另一种相似,但较适合 Framework 精简版的一种是 IABASE,因为.NET Framework 精简版主要是用来构建 GUI 应用程序。
15.2.5 各种编程接口的比较 • 资源占用方面 • 程序运行大小方面
15.3.1 Windows CE应用程序开发的选择 • Windows CE应用程序开发,代码的选择主要有两种: • 托管代码:是指使用.NET Compact Framework开发的程序代码,可执行文件被编译成MSIL,执行时需要有.NET的运行时环境。托管代码的典型例子就是Visual Basic .NET和 C# .NET。 • 本地代码:也称为非托管代码,是指使用C++等高级语言开发的程序代码,可执行文件被编译成与CPU指令集有关的机器码,可以直接运行。由eMbedded Visual C++ 开发出来的代码就是本地代码。
托管代码特征 • 托管代码是可移植代码,这是因为.NET的可执行程序能够运行在任何已经安装了相应的通用语言运行时(CLR)的平台上,而不管是哪种CPU。 • 托管代码也是安全代码,因为它有一整套特性来避免令人烦恼的非托管代码中存在的问题,例如隐式指针,可以消除内存泄漏的自动内存管理和防止内存越界的数组边界保护。 • 我们有时也称托管代码为“.NET代码”,因为托管代码直接依赖于.NET精简框架中提供的编程接口。
本地代码的特征 • 本地代码之所以被称为“Native”,是因为生成的可执行文件格式不是可移植的CIL格式,而是本地的处理器指令集,如SH3或者StrongARM处理器。 • 同时,本地代码也被称作非安全的代码(Unsafe code),因为它缺少对内存泄漏、“坏”指针和数组越界的保护机制,而这些机制都在通用语言运行时中已被提供。
托管代码和本地代码的区别 • 本地代码主要针对于Native 应用 • 托管代码主要针对于.NET应用
15.3.2 Windows CE应用程序开发工具概述 • 在开发Windows CE应用程序时,我们可以选择的工具包括以下三种: • eMbedded Visual C++ 4.0: • Visual Studio .NET 2003 • Visual Studio 2005 • 一般来说,程序员可以使用 Visual Studio .NET 2003或者Visual Studio 2005来创建针对 .NET Framework 精简版的应用程序,可以使用eMbedded Visual C++ 4.0或者Visual Studio 2005创建应用程序。
开发模型的演变 • Windows CE 4.x开发模型
15.3.3 EVC集成开发环境 • 多数程序员的最佳选择仍然是eMbedded Visual C++,因为嵌入式系统资源有限,C++编译器效率高、性能好,编译出的应用程序结构紧凑
1. EVC概述 • 随着Windows CE版本变化,eVC也推出了相应的版本。其对应关系如下表
(1) SDK • SDK(Software Development Kit)包含了一个特定平台的所有函数。 • 在使用eVC进行开发前,必须安装特定平台的SDK,而且进行开发时必须了解特定平台支持的函数,在SDK中不包括的函数不能使用。 • Microsoft提供了一些SDK,如Standard SDK、Pocket PC2003、SmartPhone2003等等。
SDK的导出 • 如果使用 eVC针对某一特定硬件平台进行开发,那就要从Platform Builder导出特定平台的SDK,然后安装SDK。 • 导出的SDK是一个Windows安装程序(.msi文件),SDK的内容取决于包含在平台中的操作系统配置、运行时库、OAL(OEM Adaption Layer)、和设备驱动程序。
(2)EVC集成开发环境 • 在Windows CE下开发软件的编译器必须满足两个特点:第一、程序能够相对快速地执行;第二、相对减少对系统资源的消耗。EVC是最符合这两个特点的.
EVC集成开发环境 • EVC集成开发环境包括以下内容: • 编译器:包含c/c++编译器。 • 模拟器:一个运行在CPU Ring 3 级别的用户程序。 • 平台管理器:能够将编译的程序下载到指定的平台上。 • 调试器:能够单步执行程序和设置断点。 • 工作区:包含类视图、资源视图、文件视图。 • 代码编辑区:也就是文本编辑器。 • 类向导和应用程序向导。 • 远程调试工具。 • 帮助文档和在线帮助。
EVC 与VC的区别 • EVC编译器支持多种嵌入式CPU,支持多种指令集。VC只支持X86指令集。 • 为了能在开发机上调试,EVC包含一个模拟器,而VC不具备,也不需要。 • EVC包含远程调试工具,而VC只包含本地调试工具。 • 随EVC安装附带的SDK内容非常少,必须安装Windows CE.NET才能得到全部的SDK。随VC附带的SDK则包含全部的内容。
2. EVC集成开发环境的重要工具 • (1)模拟器
15.3.4 Visual Studio.NET工具 • Visual Studio是Windows平台下的应用程序集成开发环境,它是一个强大的可自定义编程系统,可以利用它所包含的各种工具快速有效地开发功能强大的Windows应用程序、Web应用程序和移动设备应用程序。
1. 编程语言 • 在Visual Studio.NET中,编程语言分为两种: • (1)C# • (2)Visual Basic .NET
2. SDE • 智能设备扩展(Smart Device Extension ,SDE)是一个Visual Studio集成包(Visual Studio Integration Package ,VSIP),它是Visual Studio.NET的插件。与eMbedded Visual Tools工具不同,它不能单独运行,而必须安装Visual Studio.NET后才能使用。 • 在SDE中,包含了一系列预建的设备模型以及设备开发包,可以帮助开发人员针对特定目标设备开发特定的应用。SDE允许直接写应用程序到Windows CE.NET设备或仿真器,并且可以为嵌入式设备定制Visual Studio.NET开发环境。
.NET Compact Framework组成 • WinForms • ADO.NET • XML and XML Web Services
WinForms • 表单: • Form f = new Form(); • f.Text = “My Application”;//设置表单头 • 控件: • Button b = new Button(); • f.Controls.Add(b);//将按钮控件添加到表单中 • 时钟: • Timer t = new Timer(); • t.Interval = 1000 ; //设置时间间隔milliseconds
WinForms示例 • public class HelloWorld • { • public static void Main() • { • Form frm = new Form( ); • Label lbl = new Label( ); • lbl.Text = "Hello world"; • frm.Controls.Add(lbl); • Application.Run(frm); • } • }
ADO.NET编程实例 • 建立DataSet的过程 • DataSet myDS = New DataSet("Project"); • DataTable myDT = myDS.Tables.Add("Task"); • myDT.Columns.Add("Name", System.Type.GetType("System.String")); • myDT.Columns.Add("Start", System.Type.GetType("System.String")); • myDT.Columns.Add("Duration", System.Type.GetType("System.String"));
填充DataSet • DataRow myDR = myDS.Tables["Task“].NewRow(); • myDR["Name“] = "Design Code“; • myDR["Start“] = "2/1/2003" ; • myDR["Duration“] = "2 days“; • myDS.Tables["Task“].Rows.Add(myDR);