1 月 2010

关于Nokia 5800安装sis时的证书过期问题

以前在S60 3rd的机器上安装刚做好的sis时也会出现“证书过期”的提示,或者是证书尚未生效,但通过调整系统日期时间的方式可以将就过去,可5800上出现同样问题时就不行了,调系统时间怎么也找不到证书合法的时间段,调靠后点说证书过期,靠前点说证书非法,已过期或手机日期设置不正确(Certificate may be not valid, is expired or phone’s date settings may be incorrect)等,确定证书生效时间肯定没问题(经过symbiansigned在线签证的,装在3版机上也没问题)。其实这是5800系统的一个bug,据说目前还没有修正,经过我的测试,这个bug只会影响非自签名的sis安装,如果是自签名的包安装是不会出这种错的。在这bug修正前的临时解决方法就是备份手机资料,然后用*#7370#将手机恢复出厂设置(默认锁码12345),然后重启设置正确的时区日期时间以后就可以了。N97没试过是否也这样,所以不确定这个问题是5800的通病还是S60 5th的通病。

Symbian编译时的Error -1073741819错误

完整错误信息类似下面这样:

make[1]: *** [\Symbian\9.2\S60_3rd_FP1_2\EPOC32\BUILD\…\Gif_Reader.o] Error -1073741819
make[1]: *** Waiting for unfinished jobs….
make[1]: *** Waiting for unfinished jobs….
make[1]: *** Waiting for unfinished jobs….
make: *** [TARGETMGATE] Error 2

这只是在整个过程中的一部分出现,最后提示还是***Build Complete,carbide的problems里也没有任何对应的代码位置提示,很容易误解成sdk或这编译器坏了,网上有人说重装sdk,有人说clean一遍项目。其实这是由于代码里写了一些貌似合法但实际不对的写法,举个具体的例子就是拿对象类型的变量强制转换成指针使用,比如

CCoeControl& iParent;
((CTestAppView*)iParent)->foo();

这样,就会导致这种build错误。

WM下MFC基于对话框(dialog based)程序的最小化

在WM下的MFC基于对话框程序(VS模板自动生成状态下),运行之后右上角显示的是OK图标,点击后走的逻辑是dialog的OnOK()默认逻辑,会直接把对话框程序关闭掉。这个右上角的按钮据说在SDI或MDI程序运行时显示的是X,会有对应smart minimize的功能,就是点了是最小化隐藏的功能。开始尝试使用ShowWindow(SW_MINIMIZE)的方法来最小化对话框程序,发现结果是右上角的ok没了,下面的左右软键菜单没了,但程序主窗口还在显示,没有像用过的其他程序那样ok按了以后显示windows的today界面。后来换用ShowWindow(SW_HIDE),这样确实是隐藏了,也看见today了,但是再想重新打开程序就不行了,htc的应用程序列表里没有我的程序,开进程管理器直接激活进程倒是可以,但是切换的话会提示说程序窗口已被隐藏XX,不能再打开了,只能强制结束进程。
其实这个问题好像很早以前就被发现了,据说是个today的bug,详情看这:QA: How to create Today-friendly dialog based application?,默认对话框的窗口类型是WS_POPUP,而默认情况下基于对话框程序的这个dialog window的parent就是today这个窗口(等价于windows的desktop),最小化或者直接激活today显示会导致触发其子窗口的显示,所以又把dialog给弄出来了,解决方法倒是相当简单:把WS_POPUP样式换成WS_OVERLAPPED!

关于WM上左右软件菜单项的EnableMenuItem(使用MFC的CCommandBar添加)

关于WM上MFC程序对左右软件菜单的控制,可以用win32的方法ShCreateMenu这套逻辑,或者使用CCommandBar这个类(替换掉的以前5.0之前的CCeCommandBar类),先Create然后InsertMenuBar就可以将常规menu资源作为左右软键对应的菜单显示,还可以添加toolbar,虽然看上去有点挤。
由于这种创建菜单的方法,让我误认为只是将win32的menu换了个添加方法,换了个绘图位置,导致后来要实现动态enable,disable菜单项时遇到了挠头的问题。按照常规的做法,在执行逻辑时调用EnableMenuItem(hMenu,IDM_MITEM,MF_BYCOMMAND|MF_GRAYED),函数调用,返回值以及参数hMenu都没有问题,但执行起来就是没有disabled的效果,google了一通发现国内国外都有很多人提到这个问题,最终也没有个明确的答复,不是说参数hMenu不对,就是说用ShGetMenuXXX的去取菜单,怎么看也不像是真正的解决办法。
后来在一篇动态更新菜单名称的文章中看到貌似WM对左右软键的菜单是作为POPUP MENU处理的,也就不像是win32正统主菜单那样,嗖得丝内,恍然大悟,换用响应WM_INITMENUPOPUP消息的方式,对要变更的菜单项作弹出菜单时的enable disable处理,问题解决,没想到被一个菜单项给杯具了……

发现一款比较好用的WM上的telnet软件Token2Shell/Mobile

token2shell mobile版1

token2shell mobile版


token2shell mobile版

token2shell mobile版


token2shell windows版

token2shell windows版

http://choung.net/
这个软件不仅普通telnet功能做的比较好,ssh连接功能也不错,终于可以摆脱putty了。通过修改设置里的编码属性可以很好的支持中文的显示(作者好像是韩国人,对亚洲文字的支持就是比一般的国外软件做的好),用wm看看水木还是挺不错的。
其实这个软件的windows版本也是挺好用的,尤其是针对ssh的一些功能,比如tunnel等等,而且界面看上去也是简洁明快。

附上windows版5.4.1和mobile版5.3.0的特别文件,仅供学习研究使用!
http://www.k-res.net/dl/token2shellc.rar