📄 123.txt
字号:
本书假设读者了解C和熟悉微软Windows,在XP下用微软嵌入式Visual C++开发过本地程序。为了编译书中的例子程序,需要微软嵌入式Visual C++ 4.0,这可以在附书光盘中找到。需要相关的适合Windows CE设备的SDK,用于你的目标设备。
每个例子已经有一个预先定义好的工程设置,但你也可以选择从头创建一个工程。对大多数例子来说,简单创建一个普通WCE应用程序工程就可以了。对于那些要求访问Pocket PC上特殊功能的例子,即使整个工程设置不是特别为Pocket PC应用定义的,也可以用特殊的代码链接这些功能。
对那些想为Pocket PC 2000和2002写应用程序的开发者来说,需要使用 嵌入式Visual C++ 3.0。不幸的是,附书光盘没有足够的空间同时放eVC3和eVC4,但你可以从微软网站下载eVC3。还需要用于这些老版本Pocket PC系统的SDK。一些例子,例如蓝牙、OBEX和服务等例子,使用了老系统里没有的例子。
用Visual Studio.NET 2003可以开发.NET精简框架应用程序。因为太大和非免费,所以没有在光盘里提供。当然,这个工具是非常高效的开发工具。那些对开发可管理代码感兴趣的人来说,开发效率提高减轻了升级花费所带来的痛苦。在精简框架这一章,你需要Visual Studio.NET 2003来编译里面的例子。该工具为所有的Pocket PC设备以及基于Windows CE 4.1以上的嵌入式版本提供了必要的运行时库。
目标系统
你并不需要Windows CE目标设备来体验书中提供的例子。各种SDK平台都带有Windows CE模拟器,让你可以在Windows XP对Windows CE程序下执行基本测试。在你手边没有实际的设备的时候,可以很方便地使用模拟器。模拟器执行PC模拟器中的Windows CE版本,而PC模拟器会在PC上执行一个实际的Windows CE操作系统。
在决定使用哪种Windows CE硬件来测试的时候,你应该考虑很多因素。首先,如果应用程序式一个商业产品,你至少应该为每种目标CPU购买一个系统。你需要在所有目标CPU上进行测试,因为虽然源代码可能相同,但执行结果可能不同,并且每种目标CPU分配的内存大小也不同。
其它资源
虽然我试图将本书做成“一站式”的Windows CE编程书籍,但没有一本书可以覆盖各个方面的。通常,要了解更多Windows编程知识,我推荐经典书籍--Charles Petzold写的Windows编程(微软出版社,1998)一书。这是迄今为止最好的Windows编程书籍。Charles提供了例子,演示如何解决困难而又常见的Windows问题。要更多的了解Win32 核心API,我推荐Jeff Richter的《Windows 核心编程》(Programming Applications for Microsoft Windows (Microsoft Press, 1999))。Jeff揭示了进程、线程和内存管理方面的很多细节技术。要了解更多的MFC编程知识,没有比Jeff Prosise的《MFC程序设计》( Programming Windows with MFC (Microsoft Press, 1999). )更好的书籍了。这本书是MFC版的Petzold编程书籍,可以说是MFC程序员必读。
要更多的了解.NET编程,我推荐Charles Petzold的《C# Windows 程序设计》(Programming Windows with C# (Microsoft Press, 2002))。Charles 将他令人惊叹的技巧应用到了.NET框架的Windows Form中。这是赶上.NET客户端编程发展速度的一本非常的好书。
概述
从经典的《The C Programming Language》一书开始,传统上编程方面的书都是从"Hello,world"程序开始的。这是一个合理恰当的开始。每个程序都有一个基本底层结构,分析它可以揭示所有运行在这个操作系统上的应用程序都具有的基础,避一些设计复杂的任务将结构搞的难以理解。
在本书"Hello,world"一章里,包含了关于设置和使用编程环境的细节。用于开发微软Windows CE应用程序的环境与开发标准微软Windows 应用程序的环境有些不同,因为Windows CE程序是在运行XP的PC机器上编写,却主要在独立的基于Windows CE的目标机器上进行调试的。
经验丰富的Windows程序员可能会跳过这一章进入有更多内容的主题,但我建议你至少浏览一下本章,了解标准Windows 编程和Windows CE编程之间的区别。两个开发过程中许多细微而又重要的不同之处和Windows CE应用程序的基本构架包含在第一章里。
Windows CE有什么不同之处
Windows CE有许多特性使得它不同于其它Windows 平台。首先,运行Windows CE的系统,大多数可能不使用Intel x86兼容微处理器。实际上,Windows CE运行在4种不同的CPU系列里:SHx, MIPS, ARM, 和 x86。幸运的是,开发环境几乎将各种不同CPU的所有差异与程序员隔离开了。
Windows CE程序事先不能确定屏幕或键盘。Pocket PC设备有一个240*320的纵向屏幕,而其它系统具有传统的480*240,640*240,640*480像素分辨率的横向屏幕。一些嵌入式设备则根本没有显示器。一些目标设备可能不支持彩色,并且大部分Windows CE设备用触摸屏替代了鼠标。一些在触摸屏设备上,轻触屏幕,表示鼠标左键点击,没有明显的方法代表鼠标右键。为了能处理右键,Windows 约定,当轻触屏幕的时候,按下Alt键,由Windows CE程序把这个组合序列解释为鼠标右键点击。
Windows CE设备具有更少的资源
运行Windows CE系统的目标设备上,各种资源变化极大。当写一个标准Windows 程序的时候,程序员可以对目标设备做许多假定,并且设备几乎都是IBM兼容机。目标设备通常有硬盘用于存储,同时虚拟内存系统用硬盘作为交换设备来模拟一个几乎没有数量限制的虚拟内存。程序员知道用户有键盘、双键鼠标以及可以当前支持256色、至少有800*600分辨率的显示器。
Windows CE程序所运行的设备几乎都没有硬盘作为大容量存储。没有硬盘不仅仅意味着没有地方存储大量文件,也意味着不能交换数据到磁盘上来创建虚拟内存。所以Windows CE程序几乎总是在少量内存环境里运行的。因为资源缺乏,内存分配经常失败。当空闲内存达到一个严重低的级别,Windows CE可能会自动终止一个程序。RAM的限制对Windows CE程序有很大的影响,并且是将现有的Windows应用程序移植到Windows CE过程涉及的主要挑战之一。
Unicode
在写Windows CE程序时,程序员可以使用的一个特性是Unicode. Unicode是一个字符编码标准,使用16位表示一个字符,相对的,ASCII标准是用单个8位编码一个字符。Unicode 允许相当简单将程序移植到不同的国际市场,因为世界上所有已知的字符都可以用65,536个Unicode 值里的一个来表示。处理Unicode相对容易,只要避免假设字符串是用ASCII代表和字符是按单个字节存储的。
使用Unicode的一个结果是每个字符占2个字节而不是一个,字符串长了一倍。程序员必须小心计算缓冲区和字符串的长度。你不能再假设260字节可以存储259个字符和一个0结尾符。作为标准char数据类型的替代品,你应该使用TCHAR数据类型。TCHAR在MS Windows 95和98中定义为char型,在Windows 2000,XP,Windows CE中,使用Unicode功能的程序里,TCHAR定义为unsigned short类型。这些类型定义,允许在基于ASCII和Unicode的操作系统上源代码级的兼容。
新控件
Windows CE上有许多为特殊环境设计的新控件。包括命令条、菜单条控件,提供类似菜单和工具条的功能,在具有更小屏幕的Windows CE设备上,这些为了节省空间都合并一行里。其它控件也为Windows CE做了改进。Windows CE里的编辑控件(edit control)可以设置为自动将单词首字母大写,这对在无键盘的PDA上进行设计是很重要的。对于Windows 桌面版本里的控件,Windows CE则提供了大部分。例如,日期和时间调整控件、日历控件使日历和管理器应用程序更加适合诸如H/PC和Pocket PC等手持设备。其它Windows标准控件做了功能裁减,这反应了Windows CE特殊的硬件系统配置所具有的紧凑简洁特性。
组件化
Windows CE编程中另一个需要注意的方面是Windows CE可以被微软或OEM厂商分解和重新配置,以更好地适应目标市场或设备。Windows程序员通常只是检查Windows 版本,看是否是Windows 95/98,Me系列或者2000,XP系列。通过获得版本,程序员可以判断哪些API函数可以使用。然而,Windows CE可以按无数种方式配置。
迄今为止,Windows CE最流行的配置是Pocket PC。微软定义了具体Windows CE组件集合,这些都体现在所有称为Pocket PC的设备上。然而,一些用Windows CE生产的OEM产品--PDA设备,并不叫Pocket PC。这些设备同Pocket PC设备在API上略微不同。如果你没有意识到这一点,你很容易写一个程序能运行在一个平台,却不能运行在另一个平台。在嵌入式平台上,OEM厂商决定包括什么组件,并可以为它特定的平台创建一个SDK开发包。如果OEM厂商对第三方开发感兴趣,它会为它的设备提供一个可定制的SDK包。新的平台不断出现,它们有许多共同的地方,也有许多不同之处。程序员需要了解目标平台,在尝试用一个可能不被设备支持的功能集时,需要让程序检查在特殊平台上什么函数可用。
Win32子集
最后,因为Windows CE比XP小很多,它不能像它大块头的兄弟XP那样支持所有的函数调用。当你面对一个不支持打印功能的操作系统,比如原始模式下的Windows CE时,不要调用任何打印函数,Windows CE还去除了一些XP中支持的冗余功能。虽然Windows CE可能不支持你喜欢的功能,但其它不同的函数集可能会工作的很好。有时Windows CE编程似乎主要是用Windows CE中稀少的API来找出实现一个特性的方式,虽然成千上万的函数很少被调用。
依然是Windows编程
虽然Windows CE和Windows的其它版本之间确实存在差异,但不应该夸大这种差异。编写Windows CE应用程序依然是编写Windows应用程序。
有同样的消息循环,同样的窗口,大部分情况下,具有同样的资源和控件。差异并不会掩盖相同的地方。匈牙利命名方式是重要的相同点之一。
匈牙利命名方法
自从Charles Petzold写《Windows 程序设计》一书开始,大部分Windows程序都采用了匈牙利命名方法,这是一种传统和良好的命名方法。这种编程风格是Charles Simonyi多年前在微软发明的,它给程序里每个变量用1到2个字母的前缀来表示变量的类型。例如,命名为Name的字符串数组应该命名为szName,前缀sz表示变量类型是以0做终止符的字符串。匈牙利命名法的价值在于极大的提高了源程序的可读性。其它的程序员,或者你看一段代码,不应该重复的看变量声明来判定变量的类型。表1-1列出了变量典型的匈牙利前缀。
表1-1 变量的匈牙利前缀
变量类型 匈牙利前缀
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或者长指针,在Intel 16位编程模式下,指针分位短指针(16位偏移)和长指针(附加偏移段)。其它前缀由类型的缩写构成。例如,刷子的句柄通常是hbr。前缀可以是组合的,就像lpsz,指出一个以0结尾的长指针。Windows API中大部分结构是采用匈牙利表示法来给它们的域命名的。本书通篇使用这种命名法。我鼓励你在你的程序里用这种命名方法。
第一个Windows CE程序
说了这么多,就让我们一起看一下你的第一个Windows CE程序吧。列表1-1显示了Hello1--为Windows CE写的一个简单的Hello World应用程序。
Listing 1-1: Hello1, 一个简单的Windows应用程序
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;
}
如您所见,除了程序入口点外,代码看上去十分类似经典的Kernighan和Ritchie版程序。在注释之后,有一行代码
#include "windows.h"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -