简介我是在1996年秋MicrosoftWindowsCE发行之前开始了解这个软件的。作为一个多年的Windows程序员,我被这个操作系统深深地吸引了。这个操作系统将著名的WindowsAPI应用到一个更小、更节省能源的操作系统上。用于这个小的计算机上的API的精髓部分能使成千上万的Windows程序员为一个全新的系统类编写应用程序。然而,也有一些小的差别,使编写WindowsCE代码与编写Windows98或WindowsNT代码略有不同,我在这本书中要说明的也正是这些不同。WindoWsCE是什么?WindowsCE是最新、最小型,也是争论最多的一个非常有趣的MicrosoftWindows操作系统。WindowsCE的设计思路是一种小型的、基于ROM的、具有Win32子集API的操作系统。WindowsCE将WindowsAPI扩展到了那些认为Windows98和WindowsNT的体积太大的市场和计算机中。对于需要与DOS、Windows2.x和Windows3.x向后兼容的用户来说,Windows98是一个伟大的操作系统。尽管它也有缺点,但它在这个困难的任务面前取得了令人惊讶的成功。另一方面,WindowsNT是为企业编写的。它为取得高的可靠性和坚固性而牺牲了兼容性和大小。WindowsCE不与MSDOS或Windows向后兼容。它也不是为企业计算而设计的全能操作系统。相反,WindowsCE是一个轻量级、多线程、带有可选图形用户界面的操作系统,它的优势在于小的尺寸、Win32API子集和对多平台的支持能力。基于WindowsCE的产品第一个为WindowsCE设计的产品是手持的“管理者”类型的设备,这些设备有480×20或640×240屏幕和很好的键盘。这些被称为“手持PC”的设备,首先是在FallComdex96上展示的。在FallComdex97发布了一种得到大幅度改进的操作系统,WindowsCE2.0,它以一种熟悉的方式结合了更新的硬件——这一次,它的屏幕大小改为640×240,并且有了一个较大的键盘。在1998年的ConsumerElectronicsShow上,Microsoft宣布了两种新的平台:掌上PC和汽车PC。掌上PC针对的是现在被PalmPilot垄断的使用输入笔的管理者市场。这种掌上PC的大小有照片那么大,240×320的屏幕并使用笔式输入方式。现在市场上已经有了相当数量的掌上P。图1展示了掌上PC(这里是CasioE-10)和手持PC(这里是CasioA-20)。就在本书要出版时,Microsoft已经提出了手持PC专业版。这是一种大大增强了的,具有新的应用程序的手持PC,它使用了最新版本的操作系统,WindowsCE2.11(1)。这种产品将WindowsCE的压缩特性带到了膝上型电脑中。将WindowsCE应用到膝上电脑中的优点有很多。首先,HandheldPCPro的电池工作时间至少为10小时,比与PC兼容的膝上型电脑的平均2~3小时要长得多。其次,WindowsCE产品的尺寸和重量对用户也要友好得多,系统厚度只有1英寸,重量不超过3英磅。即使是尺寸很小,但一个HandheldPCPro仍有一个大的VGA屏幕和一个正常人即可使用的键盘。图2所示的VademClioHandheldPCPro是将WindowsCE应用在新平台中的一个例子。该系统可以作为一个标准的膝上型电脑或“翻转”为一个输入板模式的设备。这个设备就是WindowsCE如何扩展到新的系统类型的范例。我在本书中提到的HandheldPCPro是基于操作系统的WindowsCE2.1版本来说的,因为平台名称HandheldPCPro是在设计过程的末期才定下来的。实际上,我知道一种代码为Jupiter的正在开发中的HandheldPCPro。然而,在书中不能使用代码名,因此它的操作系统版本必须满足要求。其他平台——汽车PC,WebTV机顶盒和为特殊任务而设计的嵌入式平台,现在已经有了产品,或者将要在以后的几个月中出现。WindowsCE让人吃惊的是它的操作系统的灵活性,这就使它能在各种类型的设计中保留相同的、基本的和著名的Win32API。您为什么要读这本书?《MicrosoftWindowsCE程序设计》是为任何一个要为WindowsCE设计应用程序的人而编写的。对那些使用WindowsCE的为特定的应用程序编写嵌入系统的程序员和对将现有的Windows应用程序进行移植或编写全新程序的程序员来说,都可以使用本书来使他们的任务变得更加容易。对于嵌入式系统的程序员来说,可能不像Windows程序员那样熟悉Win32API,他们可以通过阅读本书的第一部分来熟悉Windows编程。这一部分与CharlesPetzold著《Windows程序设计》(第5版)(北京大学出版社,1999)不同,它不是一个全面的指南,它只为读者提供了阅读其他章节的基本信息。同样,它可以帮助嵌入式系统程序员开发复杂程度一般但具备很好的使用性的WindowsCE程序。有经验的Windows程序员可以用本书学习WindowsCE、WindowsNT和Windows98中所用Win32API的不同之处。熟悉Win32编程的程序员会认识到Windows98API和WindowsNTAPI的细微区别。WindowsCE和它的两个兄弟之间的区别就大多了。Win-dowsCE的小体积就意味着它不支持Win32模块中重复的API,甚至根本就不支持某些Win32API。另一方面,由于WindowsCE的独特设置,它将Win32API功能扩展到了在书中包含的一些领域中。本书的编写方法是通过实例来进行教学。在本书中,我写了很多WindowsCE示例程序,每个程序的源代码都打印出来了。程序的源代码和编译好的程序(这些程序可以用于WindowsCE支持的多种处理器)包括在与本书配套的光盘中。本书中的所有例子都直接写为API形式,这就是所谓的“Petzold”编程方法。由于本书的目的是让读者学会编写WindowsCE程序,所以在示例中将避免使用像MFC这样的类库,使用这样的类库会使编写WindowsCE程序的独特本质变得模糊不清。一些人也许会说,WindowsCE中MFC的实用性消除了对WindowsAPI的直接了解。我相信相反的想法是正确的。对WindowsAPI的了解会使对MFC的使用更加有效。同样,我相信对操作系统的深刻了解也能大幅度简化应用程序的调试。关于MFC一个简单的事实是,WindowsCE系统不是最好的用于像MFC那样的通用目的类库的平台。WindowsCE设备的较慢的处理器和小的内存容量会让使用MFC充满问题。绝大多数WindowsCE系统在它们的R0M中不包含MFC类库。这就意味着MFC和MFC所需要的OLE32DLL必须被下载到系统中,掌上PC的第一版甚至不支持MFC。有人说,在WindowsCE中也可以使用MFC。如果您为某个已知的在R0M中应该有MFC和OLE32DLL的系统写了一个客户程序,那么,您就可以使用MFC。对于这些特定的应用程序,您也许要使用MFC,但这仅限于您知道目标环境,并且系统已经为完成工作而配置了适量的内存。WindowsCE开发工具阅读本书的读者应该了解C语言,并且至少要对Microsoft的Windows比较熟悉。所有的代码都是用Microsoft的VisualC++5.0和WindowsNT4.0下用于WindowsCE的Win-dowsCEVisualC++完成的。要编译本书中的示例程序,您需要在标准的IBM兼容PC上运行的MicrosoftVisualC++5.0(它是集成开发环境(IDE)DevStudio的一部分)。您同样需要MicrosoftVisualC++forWindowsCE,它不是一个单独的产品,而是VisualC++5.0的一个附加项,VisualC++5.0编译器合并了一些组件,用这些组件能生成用于WindowsCE支持的不同CPU的代码。通过普通零售渠道买不到VisualC++forWindowsCE,但您可以在Microsoft的Web站点上直接获取订购信息。最后,您需要一个用于WindowsCE的平台SDK。这些平台SDK提供了用于每个WindowsCE平台的自定义包含文件,这些平台SDK可以从Microsoft的Web站点免费获得。为了方便起见,在写本书的时候,我将这个平台SDK包含在与本书配套的光盘中。尽管开发WindowsCE程序不是绝对需要WindowsNT4.0,但我强烈建议用它作为开发环境。虽然可以通过Windows98编译和下载WindowsCE程序,但是集成开发环境(IDE)的很多特性,例如,WindowsCE仿真和远程调试在Windows98中就不支持。除了一些在工具菜单中列出的新工具外,WindowsCE的VisualC++没有改变VisualC++的外观,安装用于WindowsCE的VisualC++也不会妨碍您为其他Windows操作系统编写程序。在安装了用于WindowsCE的VisualC++以后,在您创建新Win32程序时,它就会在平台列表中添加新的WindowsCE目标,例如WCEMIP、WCESH和WCEx86Em。同样,WindowsCEMFCAppWizard也将被添加到新工程列表中来帮助创建用于WindowsCE的MFC程序。 标系统您不需要用WindowsCE目标设备来体验本书中的示例程序。对于不同的平台SDK,这里有一个WindowsCE仿真器,这个仿真器允许您在WindowsNT下进行基本的WindowsCE程序的测试工作。当您想进行最初的调试工作以确保程序能启动、创建适当的窗口、对菜单选择进行了反应等时,这个仿真器是非常好用的。然而,这个仿真器也有一些局限性,并且这里没有进行替换以便让目标WindowsCE系统来对应用程序进行最终的调试和测试。在决定用什么WindowsCE硬件进行测试时,您应该考虑一些因素。首先要考虑的就是,如果该程序将是一个商业产品,那么您至少要为每个目标CP购买一个系统。您要对每个目标CPU进行测试,因为尽管源代码可能相同,但是可执行文件在大小上可能会有不同,这样对每个目标CPU的内存分配情况也会不同。绝大多数程序都是专为手持PC或掌上PC所设计的,而不是同时为它们设计的。虽然手持PC和掌上PC的基本操作系统都是WindowsCE,但其内部的硬件却差别很大。掌上PC对内存有严格的限制,它的屏幕很小,面向的对象不同,没有键盘,而这对于手持PC和HandheldPCPro都是不能接受的。掌上PC的其他一些局限,如不能打印和没有TrueType字体支持,这也使它的系统环境与手持PC有所不同。在本书中,我演示的程序能在手持PC、HandheldPCPro或掌上PC上运行。目的是让这里的课程对于所有平台都适用。然而,在某些情况下,不同的屏幕尺寸意味着示例 程序会在某个特定的系统下运行得更好。此时我会指出它们的区别以及它们存在的原因。例如,某些控件可能只存在于某一个平台上,或者存在于其他平台上。两个平台的外壳——手持PC或掌上PC——也不同,并且需要单独讲述。最后,WindowsCE中的一个小的特性集在小一些的掌上PC平台上是不支持的。光盘上有什么?配套光盘中包含了本书所有示例的源代码。我同时也为MicrosoftDevStudio提供了工程文件,这样您就可以打开预先配置的工程。除非另有说明,示例都与WindowsCE2.0兼容,这样它们就可以在现有的大多数WindowsCE系统上运行。第十三章“外壳编程——第二部分”包含了为WindowsCE2.01编译的示例程序,所以它们在现在的手持PC上不能执行。还有一些例子,例如,第十二章中的控制台程序,它们是专为HAndheldPCPro和其他在WindowsCE2.10下运行的设备编写的。当您为一个特定平台编译程序时,要记住这也许与以前的WindowsCE不兼容。例如,Microsoft将WindowsCE2.0的静态链接库中的一些C库支持转移到了用于WindowsCE2.01的操作系统,即掌上PC。这虽然减小了可执行程序的大小,但是使得掌上PC编译的代码将不能在一个运行WindowsCE2.0的手持PC上运行。然而,您仍可以为运行WindowsCE2.0的手持PC编写代码,然后让它在掌上PC中运行。除了示例程序以外,光盘上还有一些WindowsCE程序员感兴趣的文件夹。手持PC和掌上PC的平台SDK已经包含在这张光盘上了。但遗憾的是,在本书出版时,HandheldPCPro的SDK还没有完成,像其他SDK平台一样,它也可以从Microsoft的Web站点上免费获得。请仔细阅读光盘上的Readme文件,了解光盘上还有什么其他最新信息。其他资源尽管我试图让本书成为一本能包括WindowsCE编程方方面面的书籍,但是,一本书不可能包含所有的内容。JohnMurray编写的《InsideWindowsCE》是本书很好的补充,在书中,它介绍了WindowsCE的来历,了解这些信息对于理解为什么WindowsCE被设计成这样是很重要的。一旦您了解了为什么,就会很容易地推断出解决问题的方式和时间。Munay的书很了不起,这不仅因为您可以学到有关WindowsCE的知识,而且因为它是一本寓教于乐的书籍。要了解更多有关Windows编程的信息,在这里我向您推荐一本经典的书籍,CharlesPetzold著《Windows程序设计》(第5版)(北京大学出版社,1999)。这本书是迄今为止学习Windows编程最好的书。CharlesPetzold用大量的示例说明了如何解决那些尽管常见但却有一定难度的Windows问题。如果要学习更多有关Win32核心API的内容,我向您推荐JeffRichter著《AdvancedWindows》。Jeff在这本书中涵盖了极其详细的与过程、线程和内存管理有关的内容。如果要学习更多有关MFC编程的内容,没有比JeffPros-ise的《ProgrammingWindows95withMFC》更好的书了。这本书是“Petzold”风格的MFC编程方面的书,它是MFC程序员的基础读物。信息反馈尽管我尽量使本书中的内容更加准确,但是您还是会发现一些错误。如果您发现了本书的问题或对本书下一版的改进有很好的建议,请把您的想法发至CEBook@DelValle.com。我不能保证会答复所有的建议,但是我会阅读每一条建议。DougBolingTahoe,加利福尼亚1998年8月