Delphi 字体修改一例
2008-04-09 04:20:40来源:互联网 阅读 ()
声明
个人可以自由转载本文,不过应保持原文的完整性,并通知我;商业转载先请和我联系。
本文没有任何明确或不明确地提示说本文完全正确,阅读和使用本文的内容是您自己的选择,本人不负任何责任。
如果您发现本文有错漏的地方,请您给我指出;如果有什么不理解的,请您给我提出。
意见、建议和提出的问题最好写在我的主页 http://llf.126.com 的留言版上。
汉化人大宇在汉化 CTris2000 这个 Delphi 程序的时候,修改了所有 RCData 中的字体设置,但仍然有一个窗体的字体很难看,我帮他做了修改,在这里就以它为例说一下 Delphi 程序字体字号的修改。
本来,我以为要详细的说才能说清,不过现在看来,也未必,所以在这里还是简单的说一下算了。
关于 Delphi 程序的字体,以我想大概有三种情况:
一、RCData 格式。这种格式的字体字号的问题有很多工具,诸如 eXeScope 、ResHacker 等工具都可以非常方便的修改,而且这也是 Delphi 程序中的字体设置使用最多的方法,而且大多数 Delphi 程序都只使用这一种方式,而其修改方法相对成熟的多,所以我不讨论这种方式。
二、SDK 格式。有些 Delphi 程序为了追求最小的独立可执行文件尺寸,不使用 Delphi 缺省的 VCL 运行库,而是自行使用 SDK 的编程方式,不过这种程序不多,如果有,个头也很小,一般是几K、十几K的居多,如果在这些程序里出现字体不协调的问题,可以使用和修改 C 字体字号相同的方法修改。
三、VCL 内部格式。VCL 是 Delphi 使用的函数库,其内部很可能使用了不是我们所希望的“宋体,9”的窗体,不过我想来想去,也只有类似 VB 函数的 InputBox 有这种可能,也就是 CTris2000 中要求输入姓名的那个窗体,故我们要谈的就是这种方式的程序的字体的修改,而且,几乎可以确定的固定在 InputBox 上,当然,即使是这一种情况,也比较类似 C 字体的修改,而不是 VB 。(我不知道 Delphi 中相同功能的函数的函数名,所以暂称其为 InputBox)。
我修改的过程比较繁琐,所以在这里剔除复杂的部分,简单的说。
首先,使用 W32dasm 反汇编汉化后的 CTris2000.exe ,存盘,打开 CTris2000.alf 文件,查找 CreateFont ,发现只有 CreateFontIndirectA ,而没有 CreateFontA ,这真是一个烦人的开始。继续查找,发现 CreateFontIndirectA 被三个地方调用,地址分别是 4124EC 、420460 和 42A7F3 。
运行 Trw2000 ,调入 CTris2000.exe ,然后键入“bpx 4124EC”、“bpx 420460” 和 “bpx 42A7F3”设置断点,按“F5”运行,中断时键入“dd *esp”查看堆栈的栈顶指针所指的地址的内容,发现大多数情况此地址的开头都是“FFFFFFF4”,也就是“-12”,是正常的,不过有一次,它是“FFFFFFF5”,也就是“-11”,在它下面一点,我们见到了这种字体的名称“MS Sans Serif”。
用 ResHacker 检查 CTris2000.exe ,发现并不是所有的“MS Sans Serif,8”都被改成了“宋体,9”,所以首先把这些没有改成“宋体,9”的项都改成“宋体,9”,存盘。
用 UEdit 打开 CTris2000.exe ,查找“MS Sans Serif”,只有一个,在 0x5b0b8 处,为了验证,把这个“MS Sans Serif”改成“System”,运行程序,发现那个输入窗体的字体确实如我们所想的变成“宋体,12”了。
0x5b0b8 在数据段,所以,数据基偏移 = 基地址 数据RVA - 数据Offset = 400000h 5c000h - 5ae00 = 401200h ,所以,0x5b0b8 的在代码中为 401200h 5b0b8 = 45C2B8h 。在 CTris2000.alf 查找“0045C2B8”,没找到,那么,查找“0045C2B”吧,找到几处,如“0045C2B7”、“0045C2B6”和“0045C2B0”,很是奇怪。
运行 Trw2000 ,调入 CTris2000.exe ,像上面一样设断点,运行到有问题的 CreateFontA 的时候,键入“dd 0045C2B0”,看看是什么?原来是“FFFFFFF5”!好吧,把“0045C2B0”当作突破口。
打开 CTris2000.alf ,查找“0045C2B0”,发现两个地方,代码如下:
* Referenced by a CALL at Address: |:0041979B | :00419604 53 push ebx :00419605 56 push esi :00419606 57 push edi :00419607 6A48 push 00000048 :00419609 A1D0E54500 mov eax, dword ptr [0045E5D0] :0041960E 50 push eax :0041960F 6A08 push 00000008 * Reference To: kernel32.MulDiv, Ord:0000h | :00419611 E836BEFEFF Call 0040544C :00419616 F7D8 neg eax :00419618 A3B0C24500 mov dword ptr [0045C2B0], eax :0041961D A13CD64500 mov eax, dword ptr [0045D63C] :00419622 80780800 cmp byte ptr [eax 08], 00 :00419626 743A je 00419662 :00419628 E893FFFFFF call 004195C0 :0041962D 8BD8 mov ebx, eax :0041962F 8BC3 mov eax, ebx :00419631 2C80 sub al, 80 :00419633 752D jne 00419662 :00419635 BE68964100 mov esi, 00419668 :0041963A BFB7C24500 mov edi, 0045C2B7 :0041963F B904000000 mov ecx, 00000004 :00419644 F3 repz :00419645 A5 movsd :00419646 6A48 push 00000048 :00419648 A1D0E54500 mov eax, dword ptr [0045E5D0] :0041964D 50 push eax :0041964E 6A09 push 00000009 * Reference To: kernel32.MulDiv, Ord:0000h | :00419650 E8F7BDFEFF Call 0040544C :00419655 F7D8 neg eax :00419657 A3B0C24500 mov dword ptr [0045C2B0], eax :0041965C 881DB6C24500 mov byte ptr [0045C2B6], bl * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00419626(C), :00419633(C) | :00419662 5F pop edi :00419663 5E pop esi :00419664 5B pop ebx :00419665 C3 ret标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:用 Delphi 做个发信机
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash