PalmQQ动工

我们说人是有惰性的,这是相当正确的。

实在无聊的紧,我今天又是7点多睡,一直睡到十点半,现在又清醒的很,没有办法,想着法子找点好玩的东西,未果,好吧,干活。这个QQ是得写过了,唉,我还答应Tencent的PPMM二月底完工呢:(

开始一个新的系列,记录一个开发过程。

想来想去,还是挑了CW了,PODS实在难用得让我没法忍,想想这次应该是用不到什么arm code的,上次唯一想做成arm code的是那个MD5计算函数,用来算密码的东东,速度不是问题,而是上次分段没写好,眼看要过64K了,我打算把它编译到外部,好让程序小一点,可惜最后没有成功。

建新工程,用C Application Wizard,我看来看去,其实就这个合适点。不过里面的模板还是糟糕了些,对于要开始一个不是demo的程序来说,几乎都是自己写过的好。删掉所有MainForm的东西,几乎清空了rcp文件,留了一个MENU ID EditOnlyMenuBar,一个ALERT ID RomIncompatibleAlert,还有把图标先存好了。顺便说一句,ICONFAMILYEX这东西里不能只有一项的,不然图标位置会偏。

这次有个新打算,把每个form做成一个rcp文件,以后好改。而像alert这些都是单独成文件。include这么多*_Rsc.h是有些麻烦,所以再写个Resource_Header.h,光写#include好了。

PalmQQ.c文件里也就留了AppHandleEvent,AppEventLoop,AppStart,AppStop,PilotMain。在PilotMain这里也小改了一下,我正在琢磨怎么让后台运行重入时定位到正确窗口。

想了下,还是都从AppStart()入口好了,如果错误返回>10的值,如果是未登录的正确情况返回0,已登录从后台重进就返回1。于是PilotMain里根据AppStart()的返回值再做个switch跳到对应的Form就好了。

每次写程序前,目标总是定很大,前阵子想抓MobileQQ 2007的包,因为新版的手机QQ支持好友分组,支持群消息,支持传图片和文件了。腾讯不提供这协议,我用的还是旧版协议。本来希望自己分析来做的,现在想想吃力不讨好的事情还是不要做得好,何况不小心还是会完不成的。

要开始写LoginForm先了,这次把各个Pref也分开来好了,比如登录窗口要保留原来的登录号码和密码来着,不都放PalmQQ.h里了,太乱了,反正这个pref应该只有LoginForm用到,不如直接在这里做好了。在PalmQQ.h里只存它的PrefID

前两天让ayang帮忙设计界面的,一直没什么好看的,想想还是算了,不如走清纯路线。。。和原来的版本差不多就好。我原来还想支持320×480的,现在想想也算了,还是先做出来再说,以后要改应该也不是太困难,每个form里多支持一个函数罢了。

后台运行还是心病,虽然一定要支持的,但怎么做,我还是不太有谱,还没有实验过官方的方式是否可行。

丢了代码怎么办?

重写一遍是王道,当然看起来也没其它办法
Mac下的虚拟机很好用,除了有一个问题很严重。我把两个虚拟系统(XP+2003)共享了一个磁盘,切换系统时经常XP一启动就自动磁盘检查,然后就把内容搞丢了。当然我不可能同时双系统开机,它当然也不支持一块硬盘双系统访问。我奇怪的就是为什么一个关机,换另一个启动时,还会检查。检查后,主要是把文件大小改回在该系统下编辑时的大小了,所以发现所有代码文件都最后少了一段,这个用FinalData这些恢复都有问题。有人提醒我用Source Control的东西了,可是我实在不太乐意在Mac OS上装个SVN Server。

写了一周的中文联系人啊。。。我花了一天时间几乎全部重写了一遍,好在有些原来的代码还留着,搬过来用用了。
同时做了些改进,现在稳定很多。
去掉了Cache机制,因为我们的设计一次只找第一个,不用遍历完,平均来说,用户等待时间很短,而且主要问题其实是那个AddressDB.c写得太有问题了,实在搞不定怎么处理
还有,DmQueryNextInCategory这个东西不要随便用,返回的MemHandle似乎被自动lock过,我是说它有时会被自动lock,注意是有时,所以你unlock一般会死机,不unlock就会经常crash,然后说Chunck-overlocked,真是fz的问题
检索代码几乎重写了。因为码表不止64K,原来REi申请了一个大的memory区,拷贝进去。我想想还是直接lock返回MemPtr作全局用,查两个表罢了。不过他那样做也对,为了考虑以后可以在其它程序中启动,或被其它程序调用,就需要做成可以不用全局变量的形式

几个Palm开发的Tips

我其实很无奈,这个blog越来越技术化了,呵呵
随便写点最近两三周解决问题时记下来些的东西吧:
1.申请超过64K大的内存,MemGluePtrNew,这是Glue库里的函数。不要想其它方法了,这是比较标准的一个方式了。当然,还有建议你使用FtrNewPtr来申请大内存,不过那个申请出来的内存使用时需要用DmWrite来进行写操作。对于跨平台的程序编写时,需要大内存的,似乎只有用这函数了。
2.获取IMEI,PhnLibCardInfo或是PhnLibCardInfoEx,两个试试看吧,里面有一个能取到。这是FAQ里查到的,搜chm那个文档查imei直接查是查不到的
3.Treo680电话模块和650的一些不同,有些是不得不注意的,phnEvtSubscriber这个事件接到会比650上慢一秒多,这是一件非常麻烦的事情,比如导致类似来电秀的来电显示会慢一秒多,而更导致防火墙类的程序不能完成忽略功能,只能挂断
在680上接不到phnEvtUSSDInd及phnEvtPhoneEquipmentMode等几类事件,相当麻烦,不确定是什么问题
4.pmNotifyHighPriorityUITask和pmNotifyHighPriorityAudioTask两个事件会在来电前先收到,如果要做类似动画的程序时,可能会用到
5. 在Palm SDK 5.3版上短信到来时收到内容更加多些,当然短信回执是其中一样,不过还包括了发出接收端口。我想告诉你的只是,短信回执和正常短信的事件区别仅仅是接收端口不同,相当发指。。而且注意到Sample Code中的短信例子似乎完成得并不完全,我猜想处理后的短信应该是需要用PhnLibDeleteMessage删除的
6.在Palm SDK 5.3中出现了挂断网络的函数,之前的版本没有。我印象中似乎ayang想写的DA中可能需要这个API。同时这次更新中有了画蓝牙标记的Gadget,之前版本只提供电话信号和电量。
7.一般来说对于外部Lib,一般Palm程序使用时首先应该是SysLibFind,返回错误的话,试SysLibLoad,再不成功就是失败喽。一般退出时是不会用到SysLibRemove的,但是Palm SDK中对于个别库有提及需要在程序不使用时,使用SysLibRemove的,这个可能大家需要自己注意一下
8. 提一下关闭防止系统关屏的事情。我建议不要用改autoofftime的方式,有个sleeprequest的notification,处理它吧
9. 还有关于输入法的一个部分,我记起原来掌易在菜单弹出时是有问题的,即判断菜单是不是在显示状态,不知道后来REi怎么解决的。但我觉得比较“标准”的检查方式应该是WinGetActiveWindows==FrmGetWindowHandle(FrmGetActiveForm())
10.释放DBCache,这也是Palm SDK FAQ中提及的方法,用FtrNewPtr申请个2M(或其它数)的内存,成功的话,立即释放它

« Previous Page