All Stories

听《白狐》

  在Kugoo上随便按排行榜搜索的歌曲列表,几乎是重装一次才会更新一次的列表。这次偶然发现列表中一首很抒情的歌曲《白狐》。虽然听了也好些日子,而且都是一个人在静谧的夜里听,但直到今天,我才实在忍不住心中的好奇,上网搜索了一把。  搜索了才知道,原来还有一个合唱版本的,于是马上开Kugoo来听,男声稍微有点让我失望,也许是从小看电视《聊斋》而被先入为主的思想主导,我特别希望男声是像电视中的那种书生腔调。不过总的说来词、曲,以及女声,都很打动人,在百度百科中,也有不少相关的信息,原来蒲松龄不是第一个写书生和狐独的故事的,只不过是他把如此凄美而又有新意的情爱带到了大众面前。  不知怎的,尽管让人觉得悲伤,我却有点神往。

烦躁

  真的。  现在一个Lua解释器的封装类,一个插件注册表类,这样的结构是不够用的。至少需要有一个管理插件运行的模块,它可以屏蔽掉解释器的底层差异,使得使用这个模块的用户不用知道他们到底是在运行Lua脚本还是其他Ruby或是Python之类的东西。另外一点是这模块需要向不单是C++代码提供接口。也就是说,用脚本写成的插件需要使用这个接口。这个需求很合理,也很必要,不然的话,很明显的一大限制是不能再对插件进行扩展了。

果然是编译问题

  因为怀疑,所以去确认了一把。自己也懒得编译了,直接从网上找了个人家编译好的wxLua,人家是用VC8编译的,我的工程是用MinGW编译的,结果真的可以加载了,我狂晕!不管了,大不了到时候提供个Lua for Windows的安装包链接。  再回来说插件的问题。昨天主菜单是能运行起来了,不过发现有个不爽的地方。因为插件是放在一个指定目录下的,搜索出来的顺序可不是人能控制的,于是添加到菜单上的顺序也是乱的,这就不好了。由此引出另一个需求,对于一个插件应该可以定义多个菜单项,这样至少可以让这一个插件中的菜单项保持可控的顺序。

加载不了wxLua

  弄了一整天,插件框架基本上运行起来了,至少主菜单部分能出来了,证明这套机制是没什么大问题了,剩下的没解决的都属性主菜单的问题,而不是插件框架的。  不过之后郁闷地发现,用MinGW编译的使用了wxWidgets的工程,不能使用wxLua,无论是通过C API加载,还是通过Lua代码加载,都不成功。用VC编译的工程就不存在这个问题,如果是普通的工程,没用wxWidgets的工程,也是可以加载的。于是我猜测是不是因为加载相同的wxWidgets而冲突了啊!因为wxLua是用MinGW编译的,还没试过用VC编译来wxLua来试试。开始还怀疑是不是因为路径的问题,或者是用了Luabind的问题,或者是用了SWIG的问题,后来实验发现好像都不是。  用VC编译了wxLua来试试吧,如果还是不行,就没办法了,只好不在扩展脚本中使用wxLua了,唉!本来还以为用wxWidgets的工程用wxLua是绝妙的搭配呢,大不了再试试IUP之类的呗。

今天进度不错

  花了近半天时间,把about对话框弄完了,不过有点小问题,不能设置tab页的title。整天琐事很多,最近把崩溃问题解决方案稍微整理了一下,说实在的,我心里是没底的,这个任务对我来说似乎要求高了些。我也希望程序能7×24小时地运行不中断,可是无论怎么弄,稍有点复杂的功能肯定就埋藏了大量的bug。

要被Excel整死了

  今天发现原来我的机器上一直跑得好好的程序,到其他机器上就不行了。于是另外找了个装了Win2003和MS Office2003的机器上调试,发现首先我用了一个Excel2003中不存在的接口,Excel2007中是有的。于是绕了个圈子也勉强达到原来的目的了。  接着发现把图表copy到系统剪切板中再取出来存成图片的文件不行了,根本枚举不到GIF类型的剪切数据。在网上找了个剪切板观察工具,发现确实没有那个数据,不是程序的问题,原来Excel2003的接口功能就是要比Excel2007弱。于是绕了好远的路,换个接口,把图表当成图片copy到剪切板中,发现剪切板中有Meta file picture类型的数据,再用Win32 API把这数据保存成文件。很扯的是这文件不知道是不是需要什么句柄释放操作,反正直接是不能修改或删除的,不过还好能复制。接着用GDI+把这个wmf文件转换成jpg或gif。结果郁闷地发现,转换后的图表背景变成全黑的了,想了好多办法,转来转去都是黑的,只有wmf和png看起来是白的。其实大概是透明的,整了好久都没办法,下班的时候跟老雷说起这个事情,老雷说先设置一下背景色。我真想拍一下自己的脑袋,怎么就没想到这点呢!  明天再去弄了。

VC操作Excel生成统计图

  老雷说,画图功能可以让Excel来做,我曾经还抱着试试看的心理在网上找有没有免费的代码可以方便地生成各种柱状图、饼图的,没找到,也实现懒得自己去画了,于是硬着头皮去用Excel了。  VC的程序操作Excel,而且不光是为了存取数据,所以用COM是最正规最有效最理想的方法。如果是用MFC,可以让IDE自动生成其中的某几个接口的封装类,这样的好处是封装得比较高层,使用起来更方便简单一点。如果直接导入类型库,会生成整个类型库内所有的接口和类型的封装,不过是底层一点,最多是用一下COM智能指针封装的接口,可以少处理一些引用计数的问题。  先可以录一个宏,查看VBA代码,就基本知道要用哪些接口的哪些方法了,但实际上如果用VC通过COM来操作,会发现跟VBA的结果经常有些出入。这让我有点纳闷。不过今天整了一天,总算勉强完成任务了。

插件开发环境

  想起插件的事,如果一个软件具备插件扩展能力,同时又希望其用户自行开发插件,那么这个软件一般说来需要提供一个良好的插件开发环境。纵观Eclipse,MSVS、MS Office等都是这样的,而且VS和Office中的扩展形式除了插件,还有宏,准确地说来,是开发宏的环境是随软件一起提供的,而插件的开发是要用其他工具的,比如VS。而我前面说的插件开发环境,其实对应的是宏开发环境。  这个开发环境简单的做法,应该是一个独立的程序,但与软件主程序之间有很深入的进程间通信,不然调试功能是不可能那么完善的。也有可能是还有一个中间的宏解释执行器,主程序和宏开发环境都是只与宏解释执行器进行通信,同时该解释执行器也有调试功能。这样做的一个明显的理由是,当调试宏时,主程序可能会被挂起,而这时调试界面则要求是活动的,所以放在主程序中是不容易处理的。  Eclipse可能不需要这么做,它也许可以在不同的实例中使用不同的配置,这样可以在一个实例中调试另一个实例。  还有一种比较极端或者不负责任的做法是,不提供开发环境,让插件开发者痛苦去吧。也许用比较高级的脚本语言来做为扩展架构的底层执行器,这个问题的影响会变小,因为脚本语言对调试的需求可能会小于像C++这种编译型语言。但我觉得无论怎么样,提供一点基本的用于调试的设施还是必要的,比如至少可以加入一种打印输出机制之类的。

google test和google mock

  今天在公司里看到google test和google mock,又好奇心起,看了看,觉得比起CppUnit来真的简洁不少,而且CppUnit没有一个好用的用于插桩的框架,那Mockpp和Mockcpp都有很明显的很影响使用的这样那样的限制和缺点,而google提供的这两个框架则比较好地解决了这些问题。  回到家又上网下载gtest试试,它有msvc的解决方案文件,也有GNU make的makefile。不过msvc倒是能直接编译通过,而MinGW则是不行的,要改些地方。首先要将MINGW的识别宏添加到GTEST_OS_WINDOWS宏定义中,然后在几处使用了SEH的地方,__try/__except都是VC才用的东西的,只要再在编译开关处把MINGW去掉。这样gtest库是可以编译通过了,不过有一个自测试文件gtest_unitest.cc却还是有问题,要加个文件头包含limits.h,这样就可以全部编译通过了。  又顺带看了一下googlemock,它依赖于tr1。在公司里,我什么都没修改,直接用VS2008编译过了,在家里却不行,总是报VC的xtr1common文件中的什么tr1没开启。上网找了下解决方法,加入boost就行了,不过我试了发现从trunk中取到的boost不知为什么不行,最后还是从googlemock的官方网站上下载到一个他们从boost 1.36.0中提取出来的tr1中tuple部分,这样在编译包含路径中添加boost和tr1的路径,就可以编译过了。但它在源代码中明确限制了只能使用VS2005或更高版本来编译,看来要用在MinGW中是有点困难了。