准备学习 eVC
我的第一个项目
仅仅通过另一个简单的步骤创建项目
同中有异
制作一个声音
暂时先到这里
欢迎回到大家非常熟悉的 MSDN Pocket PC 开发中心,Larry Roof 和我将在这里轮流为您讲解日益流行的手持设备的编程技巧。
当 Larry 带着他的 iPAQ 走在大街上寻找无线 Internet 接入时,像我这样明智的人正在一边查收电子邮件,一边坐在本地星巴克舒适的椅子上,空间有 Volkswagen Beetle 那么大。这不是开玩笑 — 西雅图令人神往的咖啡商场正忙于安装 11Mbps 的无线 Internet 接入点,这意味着我可以一只手拿着 double-tall latte 编写这个特别的专栏,另一只手拿着油炸圈饼,同时感谢 Office XP 的语音识别功能。
上个月,老好人 Larry 准备使用令人崇拜的 Visual BASIC 语言阐述开发过程。您知道 — 它更像图形冒险程序,而不是真正的编程语言,它包含可爱的小图片和对话框,您可以将它们拖过屏幕。这次我们将使用真正的编程语言 — C++。不用担心,我们不会仅停留在简单的“Hello World”层面上。如果您是一位经验丰富的 C++ 编码人员,那么您会非常吃惊:将您现有的知识应用于这个令人兴奋的新平台是多么的容易啊!如果您刚刚起步,或者很少接触,那么您也可能印象深刻:编写您的 Pocket PC 应用程序是多么的简单啊!
如果您有 Windows ® 开发经验,那么您可能想知道,这个 C++ 版本是否是某种“玩具”语言。它会提供 Win32 ® 兼容的 API 吗?MFC 如何呢?ATL 如何呢?有什么样的调试支持呢?
好的,你们都会受到很好的款待。eVisual C++ ® 不是 C++ 的简装版本,它是真正的 McCoy。此外,Pocket PC 操作系统也不是玩具 — 它是真正专业的操作系统,因此您可以认为其中存在许多 Win32 API。MFC?没问题。这个版本支持 MFC 并且也支持 ATL。然而有些功能已经失去或减少了复杂度,您会倍感轻松。
准备学习 eVC
回想那些黑暗的岁月,大概看起来就像现在这样,Windows CE 开发套件由大量 Visual Studio 6 ® 开发套件的“插件”组成。实际上,需要多个插件 — Windows CE 工具包组件和每种您想开发的设备的软件开发工具包 (SDK)。SDK 免费,但 Windows CE 工具包需要付费。也就是说,结合 Visual Studio 6 昂贵的专业版需求,为 CE 开发昂贵的业务。
当发布 Pocket PC 设备时,显然有许多事情已经重新考虑过了。令我们高兴的是,这包含开发工具。胜于过去昂贵的系统,现在有一种完全分开、独立版本的 Visual Studio 工具,它是为 Windows CE 开发单独设计的工具,称为 Microsoft eMbedded Visual Tools 3.0。SDK 仍然存在,您想开发的每个设备都需要一个 SDK(即 Pocket PC、Handheld PC 以及任何下一代设备)。现在可以从 https://msdn.microsoft.com/library/default.asp?url=/downloads/list/pocket2002.asp 免费下载 eMbedded Visual 工具以及 C++ (eVC++) 和 Visual Basic (eVB) 这两个版本。有三百多兆,下载过程会很长,因此可以考虑使用 CD-ROM 中的工具包。可以在 Microsoft Evaluation & Resource Center 网站获得全部详细信息。
您可能会想,“好吧,实际上我没有 Pocket PC,但我仍然希望尝试一下。您可以把您的 Pocket PC 借给我吗?”当然,我非常想把我的设备借给您,但是有更快的方法 — 模拟器。模拟器是一种运行在您桌面上的 Pocket PC软件版本。它的外观和行为都像真的一样 — 它甚至有许多标准的 Pocket PC 应用程序,并且您可以编写软件并查看它的运行情况。好的,虽然它并不完美,但您会发现它非常有用 — 特别是当您的口袋中没有 Pocket PC 时。
ms837876.road05232001-fig1(zh-cn,MSDN.10).gif
图 1. Pocket PC 模拟器立刻使开发变得简单。
如果您将安装一台 PC 来担当您的 Pocket PC 开发设备,那么我强烈建议您使用 Windows 2000 作为您的操作系统,不要安装任何以前的 Visual Studio 版本(Windows CE 或任何其他版本的 Windows)。不要企图使用 Windows XP,甚至 Windows 98 或 95。虽然可以使用 Windows 98,但是有几个“陷阱” — 您需要使用 Windows 98 SE,即使这样,诸如模拟器这样的重要工具也不能运行。我使用 IBM Thinkpad 390 便携式电脑作为我的开发机器。虽然它可能不是最新型的机器(IBM 可以随时送我一台新的 Thinkpad!),但是在 Windows 2000 下它运行的很好,当然,它可以移动旅行到星巴克进行咖啡因升级。
说到咖啡,我现在会避开快饮,直到您挑选出您的 PC 并且安装完开发工具。记住,在同一机器上完全可能既有 eVB Visual BASIC 工具又有 eVC Visual C++ 工具,因此如果您上次遵循 Larry 的建议,那么您的机器仍然可以良好运行。
我的第一个项目
启动 eMbedded Visual C++,会向您呈现出非常熟悉的 Visual C++ 6.0 版的画面。有一些变化,但是基本上没变,如果您使用过 Visual C++ 6.0,那么您会感觉就像遇到了一位老友。
现在是向您介绍向导的极好时间 — 一组将会使您的生活变得方便快捷的功能。向导将带领您创建您的项目,甚至带领您进阶 — 您可以创建一个完整、独立的“Hello World”程序,信不信由您。这会越来越好,因为要感谢模拟系统,为了查看所有运行情况,您甚至不需要拥有 Pocket PC。实际上 Microsoft 已经特意使这方面无关痛痒。那么就由它去吧!
用六个简单的步骤创建一个项目
启动 eVC。
从 File 菜单中选择 New。
您会看到下列对话框 — 或类似的东西 — 取决于您安装的 SDK。对话框列出了所有可能的不同程序类型,向导知道如何帮助您。
选择 WCE Pocket PC Application。
在 Project name: 框中输入项目名称,例如 Helloworld。
单击 OK。
ms837876.road05232001-fig2(zh-cn,MSDN.10).gif
图 2. 可用的项目向导
仅仅通过另一个简单的步骤创建项目
一旦您已经确定了项目的名称和类型,那么您就可以决定要为您做多少工作。此时让我们偷会儿懒。
懒惰编程
选择 A typical "Hello World" application。
单击 Finish。
单击 OK。
稍等,正在为您创建代码。
ms837876.road05232001-fig3(zh-cn,MSDN.10).gif
图 3. 编程的懒惰方法
非常令人惊讶,这就是编写一个 Hello World 应用程序的全部。如果您不相信我,那么可以运行一下这个程序。 让我们试着启动模拟器,它是一个有用的小实用工具。它并不完美,但它是免费的。
构建您的程序
选择 Win32 (WCE x86em) Release 或 Win32 (WCE x86em) Debug 作为活动配置。在屏幕快照下面标记下拉菜单。
从 Build 菜单中选择 Execute Helloworld.exe。
将会加载模拟器并在屏幕上进行显示。酷!
然后会问您是否需要构建您的程序。选择 Yes。
于是您的新程序就可以构建、复制和启动了。
如果您的程序没有启动,请点击模拟器的 Start 并找到 Helloworld.exe。
ms837876.road05232001-fig4(zh-cn,MSDN.10).gif
图 4 :选择活动配置。
ms837876.road05232001-fig5(zh-cn,MSDN.10).gif
图 5 :令人感到惊奇的应用程序
当然,实际上不是每个人都需要这样强大而缺少变化的程序,因此向导会向您提供几个其他的选项,例如,创建一个空项目或者创建一个 MFC 应用程序。我们将看到这些选项,不用担心。
同中有异
如果您浏览一下新项目的源代码,同时您知道想要找什么,那么您就会看到所有相似的代码片段,它们组成了所有的 Windows 程序。这有什么大惊小怪的呢?Pocket PC 只是一种通过 Shrink-o-Matic 光线传递信号的普通 PC 吗?不,这是不同的。或许最根本的不同在于没有硬盘,因此没有长时间的启动过程。当您按下 Pocket PC 上的“On”按钮时,它将在一秒内启动,因此它会在您需要它的任何时间出现。
当您按下“Off”按钮时,设备将进入特殊的低能状态。屏幕关闭,CPU 休眠,只使用微量的电池电流来保持内存和一些内部时钟运转。
如果您按下重启按钮,那么设备将清除它的程序内存,停止所有正在运行的程序并重新启动。如果您移走电源(或者触发了一个与设备特定键组合的完全重启键),那么设备就会执行完全重启并恢复到它的出厂设置。如果它会删除您安装的应用程序(而不是 ROM 中内置的应用程序,例如 Pocket Word)和您的数据,那么无论如何您将不希望这些事情经常发生。
那么,我为什么要告诉您所有这些事情呢?“您喝醉了吗?”我的经理常常问我。不 — 这是一种状况:Pocket PC 与“真正”的 PC 不同之处在哪里,我们什么时候可以利用这种不同。可以这样处理 — 我们将开发一个应用程序,当您打开 Pocket PC 时,它会发出美妙的声音。我的设计允许您增加优美的声音效果 — 例如 Hitchhiker's Guide to the Galaxy 这本书所制作的声音(在 Douglas Adams 内存中) — 当您打开您的 iPAQ、Jornada 或 Cassiopeia 时。
现在如果您已经用过 Pocket PC,那么您可能发现 Windows 下有个名为 Startup 的目录。您可能已经假定,当设备启动后您希望建立它时,这就是您放置应用程序的地方。好的,这是陷阱 — 它不是这样运行的。只有在重启之后,Startup 目录中的所有程序才能执行,这意味着我们无法只通过将声音效果程序放入 Startup 来播放我们的声音效果。或许我们可以,但是只有在每次执行重启时它才播放,这相当蹩脚。
下面是一种巧妙的方法。我们将使用 Windows CE 特定的函数,它可以在启动时创建一个程序。我们创建的程序将是一个可以播放声音效果的程序。上面我说的都明白了吗?好,现在我们开始。
制作一个声音
首先,我们会编写一个可以播放声音示例的程序。Pocket PC 可以使用名为 sndPlaySound() 的简单的 API 函数重新播放标准 WAV 文件。保持我们一贯的懒惰风格,我们将使用向导创建一个空项目,然后简单地调用 API。让我们开始。
创建您的 PlaySound 程序
关闭 embedded Visual Tools 中任何现有项目。
从 File 菜单中选择 New。
选择 WCE Pocket PC Application。
输入程序名称,例如 PlaySound。
选择 OK。
选择 A simple Windows CE application 作为项目类型。
选择 OK,创建您的项目。
使用 File View 浏览构成项目的源文件并选择 PlaySound.cpp。这是程序的核心,我们将在此处添加触发声音效果的代码。向导也添加注释“Place code here”,以免有什么疑问。
因此,用下面这行代码替换那一行:
sndPlaySound(L"Asterisk",SND_ASYNC);
sndPlaySound 函数带有两个参数 — 第一个参数是播放的文件名称,第二个参数是一个标志,告诉系统如何播放声音。您可以从联机帮助中获得关于该函数的更多信息。我们可以依赖于此处存在的示例 Asterisk,它作为默认声音构建到每个设备中。实际上我们可以不写文件名的“.wav”部分,假定它存在。还要检查字母“L” — 它不是印刷错误,编译器需要将它后面的文本看作 Unicode,我们将在更新版本中介绍 Unicode。
如果您有一个真正的 Pocket PC,那么现在正好可以连接上并运行 ActiveSync。如果您没有,您也可以一直使用模拟器,但是说实话,您现在真的想买一个,对吗?继续,当您访问本地计算机存储器时,我们会一直等待您。
好的,然后呢?非常好。打开您的 Pocket PC 并将它连接上。现在您需要确定设备使用的处理器,因此您可以挑选正确的活动配置。您的设备会告诉您是否选择 Start/Settings/System/About,但是对于大多数普通的设备,下面的表格将十分方便:
展开表
设备
处理器
HP Jornada
SH3
Compaq iPAQ
ARM
Casio Cassiopeia
MIPS
使用这些信息来选择正确的配置。此时不用担心选择 Debug 还是 Release — 两者都可以。
构建程序,它将自动复制到您的设备中。当您运行它时,您应该听到该示例。如果没有听到,那么请检查您是否开启了您设备上的音量控制,您是否正确拼写了“Asterisk”。(不要笑 — 我的老板常常指责我的拼写,作为一个技术作者,这可能会伤害我的自信心。还用怀疑吗,我已经情感崩溃了,对吗?)
现在我将编写一个程序,它在启动时执行该 PlaySound 程序。请关闭 PlaySound 项目,然后创建另一个新的 "A simple Windows CE application" 类型的项目。调用这个“PlayOn”,此次将下列代码行添加到 PlayOn.cpp 文件中:
CeRunAppAtEvent(L"Playsound",NOTIFICATION_EVENT_WAKEUP);
该函数是 Windows CE 特定的函数(名称开头的 Ce 应该告诉您),当它收到一个特定的通知消息时,实际上它只是运行指定的应用程序。相关的消息是 NOTIFICATION_EVENT_WAKEUP,当设备开启时发出此消息。
当您运行该程序时,您只需运行一次,系统会一直准备着 — 关闭,然后开启,然后呢?然后呢?您将看到一个错误信息。Playsound.exe 应用程序必须在 Windows/ 目录中,而不是在 Windows/Start Menu 目录中,这是默认放置该应用程序的地方。从 Pocket PC 的文件资源管理器 (File Explorer) 中找到 Playsound.exe,然后将它剪切并粘贴到主 Windows 目录中。现在关闭,然后重启,瞧! — 触发了声音示例。
现在可能出现了两个问题。首先,您如何能够使用自己的示例呢,其次您如何能够阻止它们在您每次开启设备时发生呢。
使用您自己的示例比较容易。随便找一个 WAV 文件,然后将它复制到 Pocket PC 中。不要试图使用任何一种非常古怪的采样速率,然后更改 Playsound.exe 程序以反映新文件名。
每次都阻止系统运行 PlaySound.exe 应用程序,这有点棘手。通知系统将幸免于热重启,因此您需要编写另一个应用程序。创建该程序并调用 PlayOff,然后添加下面一行代码:
CeRunAppAtEvent(L"Playsound",NOTIFICATION_EVENT_NONE);
这一行抵消了现有的通知。运行一次,自动启动功能会禁用。
暂时先到这里
我希望 eMbedded Visual C++ 的这个介绍对您恰好合适。通常,在无足轻重与纷繁芜杂之间找到平衡是非常困难的。如果您认为我会在一个方向而不是另一个方向迷路,那么请随时给我发邮件,这样可能会有助于您产生将来的专栏。谢谢阅读本文!
John Kennedy 白天是 Visual C++ 组的技术撰稿人/程序员,晚上则过着 Pocket PC 开发人员的神秘生活。
Larry Roof 是 tonked 的合作伙伴,这是一家专门从事移动解决方案开发和培训的公司。他是 Professional Visual Basic Windows CE 一书的作者,可以从 Wrox Press 获得此书。