Archive for 8 月, 2008

自己写的黑莓手机IPD编辑工具BBerIPD

星期日, 31 8 月, 2008

黑莓手机的“桌面管理器”能把手机里的信息备份成IPD文件,也能导入IPD文件,这很方便。但在bbs.maxpda.com论坛里没有找到合适的IPD查看、编辑工具。

对我来说,能通过电脑来管理手机的“记事本”、“地址簿”,能导出手机里的“短信”内容是我最想要的,论坛里的IPDManager没办法打开仅包含这些内容的IPD文件,IPDEditor又依赖于.NET Framework 2.0,而我的电脑安装有这个Framework仍不能使用,所以我抽空研究了一下这几类信息的格式,自己写了一个BBerIPD工具,主要功能是:查看和编辑“记事本”、“地址簿”,查看“短信”内容,将选择的内容复制出来。

注意:修改后需要使用“导出IPD”功能才会生效!

(更多…)

发现了一个CListCtrl::GetItemText的Bug及解决方案

星期日, 31 8 月, 2008

近段在写个小程序时发现了CListCtrl::GetItemText的Bug,微软的源代码如下:

VC6对应文件: VC98\MFC\SRC\winctrl2.cpp
VC7.1对应文件: Vc7\atlmfc\src\mfc\winctrl2.cpp
CString CListCtrl::GetItemText(int nItem, int nSubItem) const
{
 ASSERT(::IsWindow(m_hWnd));
 LVITEM lvi;
 memset(&lvi, 0, sizeof(LVITEM));
 lvi.iSubItem = nSubItem;
 CString str;
 int nLen = 128;
 int nRes;
 do
 {
  nLen *= 2;
  lvi.cchTextMax = nLen;
  lvi.pszText = str.GetBufferSetLength(nLen);
  nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
   (LPARAM)&lvi);
 } while (nRes == nLen-1);
 str.ReleaseBuffer();
 return str;
}

问题出在标红色的句子,我发现如果读取的第(lvi.pszText + lvi.cchTextMax - 1)字节刚好是双字节字符的第一个字节时(比如中文汉字的第一个字节),该字节最后被替换为'\0'(这符合lvi.pszText以'\0'结尾的约定),但返回读取的字节数是lvi.cchTextMax而不是预想的(lvi.cchTextMax-1),导致(nRet == nLen-1)结果为FALSE而结束读取数据,但是数据仍没有读完,需要继续读取。

解决办法很简单,把(nRet == nLen-1)改成(nRet >= nLen - 1),真搞不懂为什么没有人向微软反应这个错误并促使他们改过来呢。

我自己写了一个外部函数:

CString GetItemText(CListCtrl& lvw, int nItem, int nSubItem)
{
 ASSERT(::IsWindow(lvw.m_hWnd));
 LVITEM lvi;
 memset(&lvi, 0, sizeof(LVITEM));
 lvi.iSubItem = nSubItem;
 CString str;
 int nLen = 128;
 int nRes;
 do
 {
  nLen *= 2;
  lvi.cchTextMax = nLen;
  lvi.pszText = str.GetBufferSetLength(nLen);
  nRes  = (int)::SendMessage(lvw.m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
   (LPARAM)&lvi);
 } while (nRes >= nLen-1);
 str.ReleaseBuffer();
 return str;
}

Oracle怎样修改查看字符集及字符集?

星期二, 26 8 月, 2008

[Q]怎么样查看数据库字符集
[A]
数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。
客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs6gbk,则nls_lang可以是American_America.zhs6gbk。

[Q]怎么样修改字符集
[A]8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误。
Startup nomount;
Alter database mount exclusive;
Alter system enable restricted session;
Alter system set job_queue_process=0;
Alter database open;
Alter database character set zhs6gbk;

今天是个特殊的日子:老爸33周岁生日儿子刚好是第99天

星期六, 23 8 月, 2008

今天是老爸农历33周岁生日,恰逢儿子第99天,成立的公式是:儿子=老爸×3,看来儿子将来要比老爸有出息呀。

早上外面下着小雨,一家三口睡到9点才起床,10点半才吃早饭。由于下雨懒得出去买菜就决定中午出去吃面,12点过宝宝想睡觉于是我哄着他一起睡觉,一睡就到了下午2点半,起来推着童车带宝宝去外面的“唐韵秦风”吃手擀面,算是吃了长寿面吧。

3点过吃完午饭后一路推着童车沿着福山路、张杨路到第一八佰伴,宝宝一路上在睡觉直到到了第一八佰伴的8楼把他抱起来他才醒。第一次带宝宝逛街,小家伙兴奋得很,笑呵呵的到处看。

下午5点半沿着浦东南路、世纪大道、乳山路回来,老婆还在乳山路近东方路的克里丝汀买了一个抹茶的小蛋糕回来,说是为我庆祝生日,其实那个蛋糕卷是我公司送给我的,呵呵。

刚才找了一年前买的大蜡烛出来点,算是生日蜡烛吧,许完愿使劲把蛋糕吃完,同时也消除了老婆因男子10米跳台没能拿到第50枚金牌而懊恼的情绪。

老爸已经上了而立之年了,接下来的事情应该是多多挣钱让宝宝过得好一些,但愿宝宝能健康快乐的成长!

五笔输入法字根助记词

星期五, 8 8 月, 2008
11G 王旁青头戋五一
12F 土士二干十寸雨
13D 大犬三(羊)古石厂 (“羊”指羊字底)
14S 木丁西
15A 工戈草头右框七 (“右框”即“匚”)
21H 目具上止卜虎皮 (“具”指具字的上部)
22J 日早两竖与虫依
23K 口与川,字根稀
24L 田甲方框四车力 (“方框”即“囗”)
25M 山由贝,下框几
31T 禾竹一撇双人立,反文条头共三一 (“条头”即“夂”)
32R 白手看头三二斤
33E 月彡(衫)乃用家衣底
34W 人和八,三四里
35Q 金勺缺点无尾鱼,犬旁留儿一点夕,氏无七(妻)
41Y 言文方广在四一,高头一捺谁人去
42U 立辛两点六门病(疒)
43I 水旁兴头小倒立
44O 火业头,四点米
45P 之宝盖,摘礻(示)衤(衣)
51N 已半巳满不出己,左框折尸心和羽
52B 子耳了也框向上
53V 女刀九臼山朝西(彐)
54C 又巴马,丢矢矣(厶)
55X 慈母无心弓和匕,幼无力(幺)