冒险解谜游戏中文网 ChinaAVG

标题: exttextout函数替换工具(scgame请进) [打印本页]

作者: shane007    时间: 2010-4-13 07:56
标题: exttextout函数替换工具(scgame请进)
scgame
! c. S* X# ?% g
: v$ {4 a: i* F  _你好,exttextout函数替换工具的功能部分的设计我写好了。
' A! D' H/ `) b1 Z, ?  z请编写后放入gdi32.dll的proxy dll里,谢谢! ! N/ n. I. ~7 L8 P; t& }4 {4 I
这个工具制作完以后可以通用于所有Exttextout输出字幕的游戏 ,非常有用。* B# s' l: {; o+ [6 z

+ y( Q2 e, z. z0 k& @4 f" Rhook Exttextout 为myExttextout,对传入的字符串作如下变化。 2 {$ o$ w9 G4 d1 }& x6 V% [
先把hash变换为1个12位的字符串,比如eb013c782344,然后到sub.ini文件寻找key 3 z( @( C: }& R% R
eb013c782344_cn,如有取出key值作为译文,如无,则在eb013c782344_en中写入原文, : ?: h$ e( U) Y1 L! ?
在eb013c782344_cn写入一个空字符串,以备翻译。 $ X8 o2 U/ p* t

- M3 j* |1 z8 |  u. ?- g对了,为了不导致乱码,还要hook creatfont系列函数。4 R" [( M7 k. l3 c0 ^+ F7 s
把charset和字体修改一下,就可以出中文了。  u; m4 X0 k8 y. b; G1 i5 R
可以先用那个俄文游戏试试看。
% m" j; b- n3 q+ G( ^9 w( X2 Q8 z1 P
有问题的话,请提问。
作者: scgame    时间: 2010-4-13 10:09
汗~~不懂的还真有好多
# [, j. v  {- T5 l是不是说把lpstring通过hash改成个12位的字符传然后到sub.ini里找相应的中文?
1 m% e8 w- }; Y3 U6 Y8 @/ s然后用原来的exttextout输出吗?- R8 B/ z; A3 [# K- Z7 Y
  r: v" y7 j7 R: U9 B4 R; t
hook createfont就是不管怎么样都载入中文字体?, E, S, a& ]0 H. Y9 L  j. b2 H: f4 M0 V

6 d8 M: N0 H  B不好意思哈,我对windows API不太了解,怎么hook还不是很了解呢,有什么简单的方法测试一下吗?
作者: shane007    时间: 2010-4-13 11:12
引用第1楼scgame于2010-04-13 10:09发表的 :
  W8 O, [: H  b/ I' u# R) L汗~~不懂的还真有好多 / ?# R" M* H+ O5 P3 B
是不是说把lpstring通过hash改成个12位的字符传然后到sub.ini里找相应的中文? $ G6 t/ P1 O' }- j
然后用原来的exttextout输出吗?
, o6 o0 L  _+ O; h) M& n( P3 F
! G9 l# ^6 {# b6 o+ v0 D. ~7 Fhook createfont就是不管怎么样都载入中文字体? 7 [4 |8 x6 u; W( N) J) r# f
.......

$ ]) E; ?' u. q1 y5 u  D& t7 q: [) n( T
你的理解都对。
. h; i1 `1 I5 o9 m" [7 ]/ khook 的方法就是按下面的方法作个gdi32.dll,要修改的就是上面提到的2个函数。1 B9 C8 s- q4 x1 B
完成后请放出源码。0 t: ]" w' W0 `7 w" I7 d6 R4 v5 d3 N
https://www.chinaavg.com/read.php?tid=21849
作者: scgame    时间: 2010-4-13 23:54
一定要12位的吗?好像看到有32位,16位,12位的没找到啊 [s:102]
作者: shane007    时间: 2010-4-14 06:01
引用第3楼scgame于2010-04-13 23:54发表的 :
5 c; u% k; q' N! j: T; Q一定要12位的吗?好像看到有32位,16位,12位的没找到啊 [s:102]
; X2 R7 I: O2 r3 u) Q) p
/ r8 S7 Z+ p4 N2 m0 P
不一定12位的,16位,32位均可。
作者: shane007    时间: 2010-4-14 07:58
关键是速度和唯一性。* d+ g4 j7 n( A9 }7 R

2 d6 h3 d0 m- H& i4 [' t/ Z9 F我建议这样,
# u4 l8 O' C' y取13位,第1位为字符串长度,后6位为字符串前6个字节的ascii码,
# H* v7 H3 g" o0 }8 Z4 n最后6位为字符串最后6个字节的ascii码,不足部分左侧或右侧补0X00.% n1 ^6 Y8 ?; m9 S4 q
这样可能比较快,也能保持唯一性。
作者: scgame    时间: 2010-4-14 08:11
我现在先抄了个MD5的用用,对HASH还不是很明白
& q) A% M. V' Y不过照这个方法的话,那自符串长度一样,中间那段字不一样的话会出错的吧.
作者: scgame    时间: 2010-4-14 08:17
哦,对了,我现在为了方便,并没有给hash加上_cn和_en7 V8 _: s# ]9 G% x1 i; ~
只是把英文原文写到了一个新的文件里,而在sub.ini相应的字符串前添加了个*以方便查找
作者: shane007    时间: 2010-4-14 11:11
引用第6楼scgame于2010-04-14 08:11发表的 :
5 t9 F' e+ E1 G我现在先抄了个MD5的用用,对HASH还不是很明白
1 i1 K9 J& V- Z# j不过照这个方法的话,那自符串长度一样,中间那段字不一样的话会出错的吧.
! M7 u9 W' S% N9 H' M

* N# |, T; Y5 U) W8 R; P( i& j% P3 o3 z
能按md5来做是最好的,就是担心速度。* @* F4 O  L* W: _- ?7 S" y7 W, q* L& G; C
我的方法的确是有出错的可能性,但是加大取的字节数的话应该可以避免。




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2