65.9K
CodeProject 正在变化。 阅读更多。
Home

Palm 平台入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (9投票s)

2002年11月8日

CPOL

7分钟阅读

viewsIcon

128012

Palm 世界概述,包括 C 函数列表及其在 PalmOS 中的首选等效函数

引言

欢迎阅读本系列关于 Palm 开发的文章。那么,为什么选择 Palm 呢?就我个人而言,这个决定是客户驱动的,但客户选择 Palm 的原因在于 Palm 平台被广泛接受、价格低廉且易于使用。虽然我最初持怀疑态度,但我不得不说,我也爱上了这个平台。对我这个开发者来说,原因有所不同。Palm 平台给我机会去编写代码,因为在这个平台上,速度并非易事,资源有限,而且代码必须写得精炼才能使用。我希望这能激发更多人的兴趣,而不是吓跑他们,这当然并非全是坏消息。虽然该平台的功能远不如你的桌面 PC,但你仍然可以在桌面机上使用现代工具和编译器来开发代码。这第一篇文章的目的是简单地概述 Palm 开发,并讨论如果你决定为其开发,你将拥有的选择。

我买不起 Palm

如果你没有 Palm 手持设备也没关系,因为 Palm 公司提供了一个 Palm 模拟器,可以在你的桌面上运行,与常见的 IDE 集成,甚至提供调试支持。坏消息是它不附带任何 ROM,这基本上意味着它毫无用处。Palm 通过一个开发者计划提供 ROM,但如果你在美国以外,这需要填写一份表格,我几个月前就寄出去了,但没有收到回复。模拟器确实附带了一个实用程序,可以下载 ROM 到你的桌面,这最终是我所做的。模拟器的链接与文章末尾的其他链接在一起。

语言

可以使用包括 Java、Basic、C++ 在内的多种语言来编写 Palm 程序,或者使用一些 RAD 环境。然而,正如我已经说过的,Palm 平台功能不强大,因此我选择直接用 C 来开发。有许多 C++ 类库试图围绕 C API 提供一个类似 MFC 的包装器。我选择拒绝这种方法,即使它声称很轻量级,因为它会让我与主流的文献和支持脱节,并将我束缚在一个我无法预测其生命周期的产品上。

编译器

有许多编译器可用于 Windows 上的 Palm 开发。最常见的两个编译器可能是 CodeWarrior 和 GCC。还有许多其他编译器可用,其中大多数使用 GCC 进行实际编译。在这些编译器中,我个人选择购买 Falch.net 的开发者工作室。我选择它的原因是因为它的 IDE 与 Visual C++ 6 非常相似,这使得学习使用它变得容易,而且我觉得它比 CodeWarrior 更直观。然而,这并不意味着我的选择应该是你的选择,我建议你调查一下可用的各种编译器。CodeWarrior 的优势在于它是 Palm 的行业标准,GCC 的优势在于它是免费的。只要你选择一个可以构建用 C 编写的 Palm 程序的编译器,你就可以跟随我的教程。当然,如果你正在寻找一个免费的选项,Falch 编译器的演示版对于大部分教程来说应该足够了。

C API

我想强调的一点是,为 Palm 开发意味着编写优化后的代码。这一点如此重要,以至于 Palm API 提供了 C 运行时库函数的替代方案,以避免因链接到该库而导致的程序代码膨胀。下表列出了一些 C 函数及其 Palm 等效函数。请打印出来并放在显眼的地方。你将经常参考它。

C 函数 Palm API 等效函数
strlen StrLen
strcpy StrCopy
strncpy StrNCopy
strcat StrNCat
strcmp StrCompare
strncmp StrNCompare
itoa StrIToA
strchr StrChr
itoa StrIToA
strchr StrChr
sprintf StrPrintF
svprintf StrVPrintF
malloc MemPtrNew
免费 MemPtrFree
memmove MemMove
memset MemSet
memcmp MemCmp

你会注意到,与标准库不同,Palm 函数有很多大写字母,并且字符串函数都以 Str 开头,内存函数都以 Mem 开头。这是 Palm 开发中的一个常见主题,你会发现 Palm OS 中的每个库都有其所有函数的自己的前缀。

你的开发者 ID

Palm 开发的另一个奇怪之处在于,你的硬盘就是你的 RAM。这实际上是一个性能可以很好的领域,因为搜索你的记录集不需要任何机械过程,只需要锁定内存区域并直接访问。但这确实意味着理论上你的应用程序可以访问你设备上的所有程序和数据。之所以不是这种情况,是因为有一个机制,你需要知道数据库的一些信息才能访问它的记录。这个机制的一部分涉及分配一个唯一的 4 位字母 ID。过程很简单,只需在 Palm 网站上输入你建议的 ID,你就会被告知该 ID 是否分配给你或之前已分配。ID 必须是大写字母,因为所有小写字母都保留供 Palm 使用。

int main()

你可能知道,Windows API 期望一个名为 WinMain 的函数,而不是 main 作为其初始入口点。Palm API 沿袭了这一传统,其入口点称为 PilotMain。原因是原始的 Palm 产品叫做 PalmPilot。信不信由你,我终于要给你看一些代码了。

Hello Palm Pilot

UInt32 PilotMain (UInt16 launchCode, MemPtr launchParameters, 
                                        UInt16 launchFlags) 
{ 
    EventType event; 
    if (launchCode == sysAppLaunchCmdNormalLaunch) 
    { 
        WinDrawChars( "Hello, world!", 13, 55, 60 ); 
        do 
        { 
            EvtGetEvent( &event, evtWaitForever ); 
            SysHandleEvent( &event ); 
        } while (event.eType != appStopEvent); 
    } 
    return; 
}

随着我们在接下来的文章中深入研究 Palm API,你会逐渐意识到这个例子是多么的精简,但我们仍然习惯于用这样的例子开始教学,我为什么要打破传统呢?即便如此,这个例子也有很多值得学习的地方。首先,Palm 系统是事件驱动的。我确信这毫不奇怪。可能更令人惊讶的是,Palm 定义了自己的类型。原因很简单:Palm 可以在任何提供 C 编译器的系统上进行开发。这样一来,Palm API 提供关于数值变量大小的保证,尤其是,以及变量的通用性质,就更好了。Palm API 通常会在其类型后面附加“type”一词,例如这个例子中的 EventType。事件类型就是一个事件,API 会捕获它,在完整的例子中会传递给菜单和我们自己的事件循环以及系统。在这种情况下,我们只检查启动代码,看应用程序是否正常启动,绘制我们的字符串,并运行一个最小的事件循环,以便当按下按钮切换到另一个程序或返回主屏幕时,我们的程序能够响应。下一篇文章将介绍表单开发,也就是说构建一个 GUI 和一个事件循环以允许用户交互。我知道要获得构建 Palm 应用所需的一切需要付出很多努力,我向你保证这很值得。我在编写这些文章的过程中获得了很大的乐趣,希望你也能和我一起享受这份乐趣。

链接

  • www.palmos.com - 这是获取 Palm SDK 以及注册开发者计划以获取模拟器 ROM 的地方。模拟器和其他工具也可以在这里找到,但你可能会随编译器一起获得它们。
  • Code Warrior - Palm 开发的标准,但在我看来价格有点贵,而且难以使用。
  • www.falch.net - 在我看来,这是一个优秀的产品,附带模拟器等,而且演示版没有时间限制(虽然在其他方面有限制)。
  • news://news.falch.net - 我的首选编译器制造商也在这里托管一个充满 Palm 相关信息的论坛。
© . All rights reserved.