All Stories
之前因为使用wxLua,发现如果宿主exe使用的wxWidgets动态链接库如果和wxLua使用的一样,则不能在Lua中正常加载wxLua。虽然可以通过使用不同的wxWidgets动态链接库文件来规避这个问题,但实在是很丑陋的一件事情。 今天想起来,能不能把wxLua内嵌到宿主exe中呢,这样就都使用同一份wxWidgets了。于是看了一下wxLua的代码,代码文件组织是很清晰的,很快就明白了各个文件夹下的文件是什么作用的。使用wxLua的一种方案是,它最后需要编译生成一个叫wx.dll的文件,Lua中可以直接require这个wx模块来使用。打开它的VC工程来看,也就是那么几个文件编译出来的,直接照它的样子把这些需要的文件添加我的工程中,然后编译,看情况需要修改的有几处:因为我的工程用了WXUSINGDLL宏,但这个宏会让wxLua中的一些类变成dll linkage的,所以要把这几处编译开关修改一下;有一个for wxLua的wxApp派生类,删掉;还有一处最主要的,luaopen_wx函数,有一个wxLuaState的对象,要改成直接在创建对象时把lua_State指针传过去,其他有些分析命令行参数之类的代码也是多余的可以删掉。另外还有个问题,在VC9里cell控件的代码中有一个GetRef方法,链接时报错,很诡异,搞不明白,暂时屏蔽掉那行代码。 经过这么一番折腾,终于可以直接在exe中用内嵌的Lua解释器使用wxLua了!
发现在有很多事可以做,发现自己一件都不想做,哈哈! 今天老大跟我说,是不是忘了件事,那个gem升级也得做进升级程序中去。我说那不是说另外还要用wxRuby做个程序的嘛。老大说,这种建功立业的好机会,怎么可以让。我狂晕! 找原来开发这个功能的同事咨询了一下基本原理,发现简单得令人发指,当然这种实现方案在我看来也是丑陋得一塌糊涂。看了一下他的代码,发现原来真的是那么一回事,基本的代码结构和思路都是很清晰的,除了有一些废旧的注释和代码。 我开始头痛界面的问题。原来的实现使用了XTP的ReportControl,我想这么一个原本应该尽量精简轻巧的升级程序现在已经被我弄得渐渐肥大起来了,再加个XTP就太恶心啦!而且另外一个问题也已经浮现,越来越多的命令行参数,已经让眼下那种依次比较字符串的方式不再继续适用,引入boost::program_options也势在必行,天哪!
今天一个同事发来告别邮件,没多少意外,因为上个月就已经听其他同事提到过。这同事是个比较有趣的人,告别还要写个中英文对照的双语版,而且内容严肃,很像领导讲话。除此之外,他爱好摄影,关注电子产品,这是我比较钦佩和羡慕的一点,我一直希望自己也能拥有一项比较健康的业余爱好,不过直到现在,尝试了不少活动,最终还是没找到。 同事邮件中说到一句话,我很是有点感触:“事业上所有的成功都弥补不了家庭的失败。”他说这是一句台词,我觉得在我的内心深处也许我是很赞同这种观点的,但这些年来,我却时常认为,男人在30岁之前应该能作出一番事业来,至少能让事业走上正规,而这之前,感情的事应该让路。但是我有时候对感情的渴望也是强烈得一塌糊涂。 同事还说,在这个月要去四川进行一场心灵之旅。真是一个煽情而风骚的男人啊!曾经我有一段时间也是对自己对生活失去了信心,小思宇问我想干活,我说想去旅游,小思宇说总不可能旅游一辈子吧,于是让我打消了这个念头。现在回想起来,小思宇真是个感觉敏锐的人,还是说很多女人真的有这种被人称之为“女人的第六感”的能力。 同事要走了,引发我一些思考,最近甚至想到我这半年或一年中要做哪些事,可是我往往最终只留下一个美好臆想。 祝同事以后的工作生活都一帆风顺吧!
今天发现一个很囧的问题,在保存文件的时候出现堆破坏。跟踪了一下,看到的代码才让人一阵恶寒。先到文档类中的保存代码,该函数会在之后向主窗口Post一个消息,主要是把保存的文件路径发送过去,这个文件路径保存的空间是在堆里动态分配的,到了主窗口中处理该消息的代码直接把该消息Send到另一个视图,而这个视图中处理该消息的函数会取出这个路径,最后销毁这块内存。问题就出在这块内存上,原先发送方把这字符串以ANSI形式表示,后来整个工程从ANSI转换到UNICODE后,只修改了处理消息的那边,而没有跟着修改发送消息的这边,于是两边认为的内存块大小就不一样了,于是就堆破坏了。而让我恶寒的是另外一个原因,为什么要向主窗口Post个消息,再由主窗口转发一遍。一方面运行效率低下,另一方面就是接口变动后不容易找到受影响方,这次就是活生生的例子。我想,用个observer就可以缓解这些问题吧!
在Kugoo上随便按排行榜搜索的歌曲列表,几乎是重装一次才会更新一次的列表。这次偶然发现列表中一首很抒情的歌曲《白狐》。虽然听了也好些日子,而且都是一个人在静谧的夜里听,但直到今天,我才实在忍不住心中的好奇,上网搜索了一把。 搜索了才知道,原来还有一个合唱版本的,于是马上开Kugoo来听,男声稍微有点让我失望,也许是从小看电视《聊斋》而被先入为主的思想主导,我特别希望男声是像电视中的那种书生腔调。不过总的说来词、曲,以及女声,都很打动人,在百度百科中,也有不少相关的信息,原来蒲松龄不是第一个写书生和狐独的故事的,只不过是他把如此凄美而又有新意的情爱带到了大众面前。 不知怎的,尽管让人觉得悲伤,我却有点神往。
真的。 现在一个Lua解释器的封装类,一个插件注册表类,这样的结构是不够用的。至少需要有一个管理插件运行的模块,它可以屏蔽掉解释器的底层差异,使得使用这个模块的用户不用知道他们到底是在运行Lua脚本还是其他Ruby或是Python之类的东西。另外一点是这模块需要向不单是C++代码提供接口。也就是说,用脚本写成的插件需要使用这个接口。这个需求很合理,也很必要,不然的话,很明显的一大限制是不能再对插件进行扩展了。
因为怀疑,所以去确认了一把。自己也懒得编译了,直接从网上找了个人家编译好的wxLua,人家是用VC8编译的,我的工程是用MinGW编译的,结果真的可以加载了,我狂晕!不管了,大不了到时候提供个Lua for Windows的安装包链接。 再回来说插件的问题。昨天主菜单是能运行起来了,不过发现有个不爽的地方。因为插件是放在一个指定目录下的,搜索出来的顺序可不是人能控制的,于是添加到菜单上的顺序也是乱的,这就不好了。由此引出另一个需求,对于一个插件应该可以定义多个菜单项,这样至少可以让这一个插件中的菜单项保持可控的顺序。
弄了一整天,插件框架基本上运行起来了,至少主菜单部分能出来了,证明这套机制是没什么大问题了,剩下的没解决的都属性主菜单的问题,而不是插件框架的。 不过之后郁闷地发现,用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。