免注册COM组件的制作

昨天写的博文说了关于自制COM组件的。一个COM类需要能够被调用,要在注册表的HKEY_CLASS_ROOT里面改啊改。改注册表这事情很烦躁,而且如果要发布什么小工具,“小”工具而已,要在注册表里面改啊改,是非常令人不快的事情。无意间在网上找到说从Windows XP开始,利用SideBySide技术可以让一个COM组件类不需要在注册表里面注册也能够被使用。看着让人十分兴奋,因为这下就可以不需要在注册表里面搞七搞八也可以使用COM组件了。

文章在 http://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic6 找到的。不过里面没有说到关于progid的设置。progid的设置可以在 http://www.mazecomputer.com/sxs/help/inside2.htm 参考,最后结合起来,成功让一个没有在注册表里面注册的COM类实例化了。

继续阅读免注册COM组件的制作

VC自制COM组件

Com组件这东西实在是麻烦,以前也一直没有碰过。

过程是这样子的,一天在百度知道上看到有人求助一段C++代码转成VB。我又不熟悉VB,于是就顺手给封装成DLL给了他。

然后提问者回复说,能不能给搞成能用CreateObject方式创建对象的那种方式来调用。这一看,应该要com吧?但是我不会写com。想着稍微掌握一点以后可能也能用到,就去找教学啥的稍微尝试一下。

主要参考的文章是 http://icodeguru.com/VC%26MFC/InsideAtl/ch02c.htmhttp://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567/Step-by-Step-COM-Tutorial.htm 这两篇。一开始是看后者,后面也看了前者,结合起来,大概理清一点思路了。

继续阅读VC自制COM组件

【坑】GDI+中的MeasureString

一整个字符拿去measure确实是不怎么容易遇上问题。但是你要一个一个来的话,就会有问题。原因是msdn里有这么一句话:

The MeasureString method is designed for use with individual strings and includes a small amount of extra space before and after the string to allow for overhanging glyphs.

INCLUDES A SMALL AMOUNT OF EXTRA SPACE BEFORE AND AFTER THE STRING

所以获取到的会偏大。

方法它也说得挺清楚

To obtain metrics suitable for adjacent strings in layout (for example, when implementing formatted text), use the MeasureCharacterRanges method or one of the MeasureString methods that takes a StringFormat, and pass GenericTypographic. Also, ensure the TextRenderingHint for the Graphics is AntiAlias.

没注意的话很容易掉坑

后续补充:MeasureString的时候要加StringFormat.GenericTypographic,那么在DrawString的时候也要一起加这个参数。不然它计算的时候和绘制的时候宽度又不一样了

上淘宝搞了一片51单片机来玩

淘宝上山东芯腾电子的店买了一块55元(运费不含)的学习板来玩。因为本科的时候没报这个方向,但是想试试看搞板子是什么一种感觉,于是自己花钱去弄了来。外加从图书馆搞了两本书对着学。

电路是现成的,主要是怕自己焊又没人指导搞不起来,花太多时间。 继续阅读上淘宝搞了一片51单片机来玩

VC里Tab控件页面的子窗体确定尺寸

果然问题就是在英语不好。msdn虽然有说但是看得实在是……

.net倒是很方便,直接控件拖拖拖,这个都给你实现了的。

但是sdk或者mfc里就比较麻烦。Tab控件上面的页面如果切换了,不是里面的内容要跟着变吗?但是tab控件不管里面的内容变,它只管发一个通知给你。怎么变你自己实现。于是最方便的方法就是弄很多子窗口,在切换的时候更换子窗口。

其实就是你先GetClientRect一下拿到它整个的矩形区域,然后TabCtrl_AdjustRect把这“整个”转换成“里面”。之后你去创建子窗口就可以了。

那个TabCtrl_AdjustRect说真的确实是早就看到了,但是它的说明看得半懂不懂。

VC编写的本地代码程序使用XP Style

只是避免在鱼龙混杂的网络上找到莫名其妙不可靠资料的担忧

msdn上有,不过临时去翻msdn挺麻烦的,因为没记住在哪个分类里面的话(汗

分类在Windows Desktop App Development——Windows Application UI Development——Windows Controls——Visual Styles——Enabling Visual Styles

然后若遇上网络很慢,要人命

继续阅读VC编写的本地代码程序使用XP Style

用WP手机对付存包柜条码

在沃尔玛买东西的时候,背着单肩包之类的东西去逛感觉很累,白花不少力气背包。于是把包放到存包柜。按了存包以后,给你一张看起来很不经折腾的小纸片,到时候拿着纸片上的条码去刷,存包柜的门就打开。

好吧就是这个小纸片,经常让人感觉很别扭。不知道你们有没有这种感觉:塞哪里都不顺,总是怕它揉烂了,或者不小心掉了,到时候就拿不了包了。(虽然是可以放在钱包或者类似的东西里面啦……

继续阅读用WP手机对付存包柜条码

用Win32++库编写图形界面

最近一直在找C++编写图形界面的库。用C#确实方便,拖拖控件就出来了。但是对.net Framework运行库的依赖有的时候是略烦人的。于是想掌握不需要这个就能写图形界面的方法。用Windows API编写图形界面不是说不会,就是麻烦,忒麻烦(擦汗

关于现成的各种库,用过Ultimate++、FLTK等。Ultimate++在MinGW下表现不错,看起来也很native虽然是自己画的。但是换VC就半死不活了:英文下没问题,中文的话,哼哼……它源代码是保存成UTF8格式的,里面字符串全都是raw UTF8,就等着VC报错吧 -_,- FLTK的话,win95你一脸。为了静态链接,还用了好多手段好不容易调成静态链接。看着那个界面,最终还是放弃了……而且它的fluid界面设计器生成的代码,里面的字符串遇到中文的全部给你艹成斜杠加八进制数,略烦。VCF没有接触更多,没找到它的图形界面设计器,暂时还是算了……

WTL我也尝试过,用起来怎么说呢……反正也就那德行-_,- 关键是文档,WTL的文档很烂,很多都找不来,得去看代码。对于我等没文档写不了代码的人来说……Oh my god。WxWidgets的设计哲学跟我各种不符,在Code::Block里面试了一下,虽然是有设计器,但是那个设计器不知道为什么,说不出的别扭,拖了两下,运行程序,控件乱成屎了(满脸血)。

其实为什么尝试的里面没看到很著名的那些库呢?其实相关的考虑,一个是LGPL协议:QT库遵循LGPL协议,不买不给你静态链接;GTK就干脆连买的机会也木有的样子?MFC主要还是收费吧,不像是我等现在可以买得起来自己玩的,虽然给公司做的话是完全没问题……Borland那个C++ Builder的库同理。 继续阅读用Win32++库编写图形界面

用C语言写被导入EXE的代码片段

 

用过CFF Explorer之后,发现它可以给EXE添加Seciton,甚至还可以直接导入一个文件作为EXE中一个Section,功能好赞。配合OllyDBG来对现有软件的EXE做一些小小的hack感觉效果很好。

最早的时候我是直接用OllyDBG打开EXE,然后找到一片都是0的地方来汇编代码进去。但是这样受到的限制很多,最直接的就比如有的时候找不到一堆0的地方,找到也不确定能不能写:有可能这些部分其他地方要用,又或者汇编了代码进去要保存的时候OllyDBG说存不了。现在可以直接自己添加一个Section,不会出现找不到空间的情况了。

既然可以导入文件,那比起直接在OllyDBG里面敲汇编,用Nasm来写汇编代码要方便得很多。在测试导入Nasm写的汇编以后,我就在捉摸着更加方便的事情:用C语言来写。

我选用的是OpenWatcom C编译器,没什么太多理由,正好抓到它而已。它反正也可以生成Raw二进制格式的文件。

研究了一下它的链接器,最终的结果是用这样的参数:

OPTION OFFSET=xxxxxx FORMAT RAW BIN

或者

OUTPUT RAW OFFSET=xxxxxx

一起用就会出一些奇怪的结果。说明文档非常长,不知道是不是哪里漏掉了什么没看到的部分……

一起用的时候有的时候就出现最前面16个字节全部是0,然后后面的代码全部错位,大汗……

继续阅读用C语言写被导入EXE的代码片段

现在域名是 blog.sorayuki.net ~