冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2010-4-13 07:56
标题: exttextout函数替换工具(scgame请进)
scgame ! d/ C* B0 S; I, P* Z# s
$ [) |) S  e: X, d
你好,exttextout函数替换工具的功能部分的设计我写好了。
* R3 |9 b. \  R5 }请编写后放入gdi32.dll的proxy dll里,谢谢!
( c, f6 S6 m, W* D这个工具制作完以后可以通用于所有Exttextout输出字幕的游戏 ,非常有用。
$ U  G+ H- n$ a  O$ @2 K" o  l. a. _! R1 C
hook Exttextout 为myExttextout,对传入的字符串作如下变化。 * U$ `- Y1 U) }8 P$ z
先把hash变换为1个12位的字符串,比如eb013c782344,然后到sub.ini文件寻找key . J7 l1 c8 u. G; q
eb013c782344_cn,如有取出key值作为译文,如无,则在eb013c782344_en中写入原文, & M' Z9 l: k: t
在eb013c782344_cn写入一个空字符串,以备翻译。 : Z7 R) F; C( A0 X0 E% X* S: y. b; L

, h7 j7 z5 S! }  p( f8 f$ o' b+ m对了,为了不导致乱码,还要hook creatfont系列函数。
. E3 K5 J; D$ Q, s, {3 j把charset和字体修改一下,就可以出中文了。. j' U4 x  r& _4 R
可以先用那个俄文游戏试试看。
3 m0 i6 @8 o$ z5 C8 L7 q1 _& u. B+ S$ h" e. ]( c2 H
有问题的话,请提问。
作者: scgame    时间: 2010-4-13 10:09
汗~~不懂的还真有好多( x# e$ S/ P& Q. K  @
是不是说把lpstring通过hash改成个12位的字符传然后到sub.ini里找相应的中文?
- w4 x. |# `: M% e$ \* b然后用原来的exttextout输出吗?
5 b  E* B. v5 p$ @" f. S
! M  {8 [) K) dhook createfont就是不管怎么样都载入中文字体?
. [4 u% A  W4 v, H4 L5 I  y& g' `& D5 H/ e2 A* a# o. Z
不好意思哈,我对windows API不太了解,怎么hook还不是很了解呢,有什么简单的方法测试一下吗?
作者: shane007    时间: 2010-4-13 11:12
引用第1楼scgame于2010-04-13 10:09发表的 :
& O3 b- j* h( U& o) m  i' i- |汗~~不懂的还真有好多 3 j3 `" w- Y7 _0 r" k
是不是说把lpstring通过hash改成个12位的字符传然后到sub.ini里找相应的中文?
6 V* `" l7 ?2 A然后用原来的exttextout输出吗? 0 C4 |; {$ M/ r( ]

; i2 z1 O( `, m+ _, ^+ E8 Shook createfont就是不管怎么样都载入中文字体?
) q! {8 H8 O" \, }  A.......

' A4 M- D2 [: ?* v5 S- L; p
( W" P5 z) [2 y! r& [你的理解都对。$ {$ C/ {9 G4 d5 i/ @6 j- x  i
hook 的方法就是按下面的方法作个gdi32.dll,要修改的就是上面提到的2个函数。0 E4 }1 A% Y7 |  j, U
完成后请放出源码。
0 H5 u- [# b; r" L5 w  E7 o6 Z! Chttps://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发表的 :
1 ~0 s' I( m) }( I一定要12位的吗?好像看到有32位,16位,12位的没找到啊 [s:102]
. o5 K' T9 R: T6 W" F8 @
2 o. I3 Z: p" b9 w% M: j8 H
不一定12位的,16位,32位均可。
作者: shane007    时间: 2010-4-14 07:58
关键是速度和唯一性。4 T. J! ^+ e, U1 ]2 ]/ T
2 X! w; w4 o/ u: G% _6 F4 I* u
我建议这样,3 K3 M8 `* S' g/ h/ F$ v' k. U5 S
取13位,第1位为字符串长度,后6位为字符串前6个字节的ascii码,
6 }8 _7 ?: n! ^- H# K* M* |2 |最后6位为字符串最后6个字节的ascii码,不足部分左侧或右侧补0X00.
' S0 v( o, V% e7 J. E这样可能比较快,也能保持唯一性。
作者: scgame    时间: 2010-4-14 08:11
我现在先抄了个MD5的用用,对HASH还不是很明白
- V, K  I4 w7 M% ?% _不过照这个方法的话,那自符串长度一样,中间那段字不一样的话会出错的吧.
作者: scgame    时间: 2010-4-14 08:17
哦,对了,我现在为了方便,并没有给hash加上_cn和_en( N  o8 e( k7 q, s$ s0 N) ]; v
只是把英文原文写到了一个新的文件里,而在sub.ini相应的字符串前添加了个*以方便查找
作者: shane007    时间: 2010-4-14 11:11
引用第6楼scgame于2010-04-14 08:11发表的 :
. k3 X' F" t, \. `我现在先抄了个MD5的用用,对HASH还不是很明白   F+ t# i5 N! l5 u- B
不过照这个方法的话,那自符串长度一样,中间那段字不一样的话会出错的吧. 6 x6 H; r4 K6 }' M1 p
4 n' U2 X  C/ ~* ?$ A' R

, N  O) g. i( {- G/ L" \" @, g能按md5来做是最好的,就是担心速度。( T- N7 B# f6 U
我的方法的确是有出错的可能性,但是加大取的字节数的话应该可以避免。




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