分类目录归档:程序设计

EasyHook的使用

在函数调用下钩子的做法,在制作非想天则对战平台以及Vorbis版的东方弹幕游戏,以及数据文件压缩版的东方非想天则的时候都做过了。无非也就是两种做法,一个是修改IAT,编译器在生成调用DLL里函数的代码的时候,用的是JMP DWORD [mm32]这样的语句,Windows在把EXE读入内存以后,查找它引用的DLL里的函数,然后加载这些DLL,然后把函数的地址填入一个表(数组)中,mm32就是这样的函数地址被填入的地方。那么只要修改这个地址,就能修改调用DLL中的函数的时候真正调用的函数。另一做法是修改函数入口处的机器代码,改为一个JMP rel32这样的语句,使得调用指定函数的时候会直接JUMP到自己的函数里面。这两种做法都要注意自己要调用真实函数的时候不要受影响就好了:导入表是以模块区分的,一个进程中的各个模块的导入表互不影响,所以如果是一个DLL把EXE的导入表改了,那么只要这个DLL的导入表是正常的,那么这个DLL中就可以随意调用原函数不受影响;修改入口处机器代码的做法,因为只修改了一个入口,所以能够执行入口处的几条指令,然后跳转到没有修改的地方继续执行下去,问题就能解决了。

继续阅读EasyHook的使用

算了一天终于把CRC32算对了,也理解了boost库的做法

满满的一种“被坑了”的感觉。

CRC32不是有什么多项式、初始值、调换bit顺序、结果xor值、调换结果位序之类的参数吗,常用的这个

多项式:0x104C11DB7
初始值:0xFFFFFFFF
结果异或值:0xFFFFFFFF
调换输入字节位序:是
调换结果字节位序:是

CRC的理论也不难,我就一个比特一个比特处理,写了这样的代码

继续阅读算了一天终于把CRC32算对了,也理解了boost库的做法

对话框开不开

写了个心绮楼改名工具,其实就是给你转个内码改个文件名的东西,期间用到了开启对话框显示图形界面的API函数DialogBox。但是似乎在某个用户的系统里,对话框连开都开不起来。这里面有什么学问实在不知。本来是想用GetLastError让该用户协助一下的,不过在那之前我去qq上敲了Riatre一下,想试试能不能敲诈出什么现成的经验来。

结果居然是大有收获。我用Resedit制作的对话框资源,和Visual Studio自带的资源编辑器制作的资源比起来,对话框少了DS_NOFAILCREATE样式( http://msdn.microsoft.com/en-us/library/windows/desktop/ff729172(v=vs.85).aspx 或者VS帮助文档的Windows desktop app development -> windows application ui development -> dialog boxes -> dialog box styles)。这样式看名字,不太像是正常情况下需要开启的啊……但是VS自带的资源编辑器居然会给你加这个!坑爹啊……

Resedit在对话框的属性里有一个No Fail Create,设为true即可。

另:据说当年萃梦想的config打不开也和没有这个样式有关

 

但是事情还没完,加上这个样式以后,那个人还是跟我说没解决。但是设置成兼容win2000可以。我就觉得很奇怪。突然间想起来xp样式那边,好像除了加清单文件,还要InitCommonControls一下。所以我在创建对话框前加了这个函数。……结果问题解决了

免注册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组件

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的时候也要一起加这个参数。不然它计算的时候和绘制的时候宽度又不一样了