All Stories

MinGW中使用GDI+

MinGW中使用GDI+

  昨晚坚持到1点多,做了两件事:1、验证GDI+在MinGW中的使用;2、编译wxWidgets中access这个sample。  GDI+在MinGW中的使用,在网上有不少方法,但绝大多数是不行的,至少都有点小小的问题需要自己修改一下。我本来是没想过有这方面的需求的,也是因为最近想用用GDI+,就顺便想试试MinGW是否也可以。很快就搞定了,先到这里下载一个包含GDI+的头文件和库文件的包,然后把所有头文件解压出来放到MinGw的include目录下面,再把库文件放到MinGW的lib目录下面,其实我没用这个包里的libgdiplus.a文件,而是用reimp.exe重新生成了一个。网上有篇文章说,reimp.exe后面的参数是GDIPlus.dll,其实是错的,看一下reimp.exe自带的命令行参数说明就知道,人家明明是接受一个IMPLIB嘛,所以要跟GDIPlus.lib,之后会生成libgdiplus.a和gdiplus.def文件。这些文件准备好后,可以试着写个小程序编译一下,我就没自己写,直接试着用MinGW编译wxWidgets,带GDIPlus编译,中间会报两个错,错误提示很明显,只要打开那两个文件,把它报错的地方,定义类成员函数的签名的地方,不用加类名作用域就可以了。  编译access则花了我不少时间,因为其中不少时间是在等待wxWidgets库的编译。如果使用默认的编译选项,最后可能也可以得到一个可执行程序,但在运行时会弹出消息框说要定义一个什么wxUSE_ACCESSIBLITY之类的宏。这时可以修改一下access的makefile,在编译命令行中加入这个宏定义。再编译时,可能到最后一步是说某些符号链接找不到。我当时的第一反应是,编译wxWidgets时没有定义这个宏,于是修改src/msw/setup.h中的定义,将这个宏的值设为1,再编译,到最后也是说找不到一些符号链接,这才意识到是没有链接相应的库,还是修改makefile,加上-loleacc,给wxWidgets和access的makefile都要加,就可以正常编译过了,运行access也可以正常工作了。

昨晚遭遇小偷入室

昨晚遭遇小偷入室

  早上醒来,习惯性地找床头的iPhone看时间,居然没找到,很奇怪地起床,找挎包,心想昨天记得把手机拿出来了的啊,结果连挎包也不见了,越发奇怪,等到发现卧室门打开着,才开始有点焦虑,走到客厅一看,挎包被丢在靠近门口鞋架的旁边,里面的东西已经被翻过了,钱包里面大约有1千的现金已经不翼而飞了。这时我才确认,昨天晚上有贼入室了,这才稍微有点后怕,晚上有人进来我居然什么都不知道,万幸的是,只是丢了点钱和一个iPhone,至少连T43都没丢,T200也在,PSP,NDSL都在,连一起放在挎包里的Nano都还在,除了这些,人身也是没损失。  情绪理所当然地比较差,但也不知道到底是什么心情,没有恐惧,没有愤怒,没有后悔,没有惋惜,只想躺床上睡一觉。大约的损失总共是5000RMB,却没有一点心疼的感觉,对金钱的态度自己都觉得有点不可理喻。想要钱,却不在乎钱。  这该死的国家,该死的社会,我诅咒这个世界,却对那个小偷什么想法都没有,连骂几句,憎恨一下的念头一丁点儿都没有。  还是得靠自己,拥有了强大的力量,才能保护好自己和对自己来说重要的人或东西。

可以自动提交dump分析记录了

可以自动提交dump分析记录了

  今天花了近一天的时间,重新写了一遍自动分析mini dump然后将分析结果提交到wiki上的程序。通过这次实践,也确认了我原先的想法是可行的,内嵌一个IE,然后通过它暴露的COM接口,进行一些基本的操作,主要有遍历已有元素,填充TextArea,提交。只是发现这些操作,全都不是阻塞的,所以具体应用的时候还是得留心一下。  晚上加班,看了一下一个公司的人写的ppt,介绍Erlang的,看得让我觉得有点不舒服。按我的理解来看这ppt,似乎他的意思是公司目前使用C/C++来开发电信类软件,而且有那么多的问题,而Erlang从语言的机制上就提供了不少的保障机制,可以写出更快更稳的程序来。让我感觉他在鼓吹这就是银弹。就我以为,写这个ppt的目的就不明确,或者说就算明确了,也是动机不纯,我们应该立足于眼前,如何提高公司开发人员的设计和编码水平,而不是考虑着换一种语言就妄图可以解决一堆问题。  不过总的说来,我看了《Erlang程序设计》中的前面一两章后,就觉得这是我真的需要的一种东西,也许它在保证并发上,或者FP编码风格的处理上并不完美和彻底,但就目前看来,它应该是比较适合我的需求的一个选择。

原来一直都理解错了

原来一直都理解错了

  嗯,一直以来都以为UTF-8和Unicode是一类的,今天才明白过来,UTF-8确实明明是多字节一类的才对啊,我的理解能力实在是太差了,唉!  不过今天倒是也知道了,如果只是要在ANSI、Unicode、UTF-8之间进行转换,使用两个Win32 API就可以全部搞定了,不需要用什么iconv和ICU了。总是觉得微软做的东西易用性真的很好,通用软件产品很适合普通用户使用,而那些开发工具、库、API对于开发者来说,也很好用啊!  唉,我也就只用玩一下这些容易的东西了。

桌面时钟换肤

桌面时钟换肤

  看到搜狗输入法网站上有那么多皮肤,想到哪里可以利用一下。最后想到,桌面时钟啊,以前为了弄些皮肤来,还找了不少其他的桌面日历桌面时钟之类的小程 序,把它们的皮肤里的图片都抠出来,然后转换成自己的程序可以用的格式,还真花了不少时间。输入法的皮肤与桌面时钟的布局有些微差别,于是只好只用来显示 一下数字了,不能显示那种模拟钟面的了又花了近8个小时吧,其中还有不少代码是直接复制的。好在搜狗皮肤文件是用ZIP打包的,这比较方便,原先写的那块 解压缩的功能是调用7z实现的,那接口太繁复了,不好用,还自己特地写了个小小的dll来简化,但还是怎么看怎么觉得不爽。这次就索性全部改成zip的, 从codeproject上找了个解压zip的代码。  刚弄得可以显示出来的时候,发现显示的字体有点问题。首先是字体很小,其次是字体显示部 分是透明的,颜色不明显。字体小我倒不是很关心,但颜色不明显就比较严重了,属于不可控问题了。后来乱试了一下,偶然发现用GDI+来写字时,字体不要从 HDC那里获取,而要直接从字体名称和大小创建一个,这样就可以了,两个问题都一起解决了。  演示如下:

兴致缺缺

兴致缺缺

  又要开始做环境设计编辑器了,几乎是全部重新做过。这次的计划是自己画,可是现在的我却兴致缺缺,想当年,嗯,也就是一两年前吧,我是多么的希望可以自己动手专心地实现一个这种图形编辑器啊。  我现在的想做的是把自动分析崩溃报告的事情做好。不过这种事情收益有一些,不过却不是主要业务,因为对用户来说,没有多少良好的体验可以从中体现出来。唯一的好处是,开发人员可以减少工作量,嗯,这点上我倒是真有点典型的程序员风格——懒惰!

x和dt偶尔还是有些用处的

x和dt偶尔还是有些用处的

  事实证明,x和dt偶尔还是有些用处的,有几个core dump记录,经过分析后,嗯,是x或dt后,发现就是在倒数第二次或倒数第三次调用某个对象的方法时崩溃的,而崩溃的原因就是因为那个指向对象的指针其实是个0,只要调用的方法引用了什么成员变量,那么对不起,保证完成“死给你看”的任务。想来,在知道用x和dt前,那些问题我估计是分析不出什么结果来的。  今天,抱着试试看,用VC9重新全部编译了一下Scintilla,发现真可以用了。在这之前的几天里,偶然发现只要向Scintilla发送什么消息,应用程序就会崩溃,还以为是CVS里的代码有问题。  这软件的问题啊,真是个很缠人的事啊!

除了!analyze -v外什么都不行

除了!analyze -v外什么都不行

  那些个core dump,都是我抠了FileZilla早期版本中的源代码出来,利用DbgHelp.dll的功能整出来的mini dump,本来有点迷惑的为什么查看变量内容时,老说访问内存错误,又翻了一会儿书才偶然发现,原来是这mini dump本来就只保存了寄存器和栈回调的信息,这也可以理解了,不然加上完整的内存dump,怎么可能只有几十KB大小。于是只好很沮丧地得出一个结论:对于mini dump,除了!analyze -v外,还真的什么都不行。

除了!analyze -v外

除了!analyze -v外

  今天发现,对于core dump文件的分析,除了!analyze -v外,还可以.frame一下,再x或者dt一下的。不过也就只能这么一下了,而且不知道为什么,那时x或dt出来的对于之前调用栈中的内存,显示都是读取错误,而且有时候看地址似乎也真的不对。  由于发现了x和dt这样的命令,于是今天在分析core dump时也稍微卖力了点,不过最后我却又不得不怀疑我这样的理解是不是正确的,因为有两个core dump到最后分析出来都是因为类指针为空而对它进行提领,而看代码实现是很不像会出现这种指针为空的情况啊!我大汗!  还是得继续学习啊!