论坛风格切换切换到宽版
  • 23904阅读
  • 42回复

.NET 程序初级汉化流程一例 [复制链接]

上一主题 下一主题
离线曾半仙

发帖
2409
金钱
20
威望
2
只看该作者 20 发表于: 2005-07-04
嗯,前面的标号只是作为标识,不作排序定位,在同一个{}区间中,只要不重复就可以通过编译并且正常执行.
可以给简单的例子程序加字体了.

经过两次观察,C#的程序,在不同的系统上,VS的FormDesigner中窗体的Form.Font显示的值是DEFAULT_GUI_FONT的字体的,如果你没有修改这个字体,他的状态是未更改的,那么程序中将不会存储这个字体,也就是说默认值不存储原则, 跟删除DFM中间默认的属性程序照常运行不会遭天谴一样.当然改变一下默认属性,就是说重新选择一下,属性显示为已更改,在窗体设计器的属性栏会加黑表示,那么就会在程序中产生代码,加以设置.
没有字体的控件,由运行时候framework生成,也就是一些E文C#软件哭着喊着显示宋体了,例如上面说的pspvideo9.

经过观察了多达一个的试验程序,发现给窗体设置字体的语句出现在给窗体setname之前;
如果懒得在设置窗体名称的语句前
比较胡来的做法,就是加到最前面,也就是紧接着.locals int等;
如果爆错可能.max stacksize要加一些,例如+3
结果在line#9426粘贴了如下诡异代码:
CODE
//tahoma start
     IL_fv01:  ldarg.0
     IL_fv02:  ldstr      "Tahoma"
     IL_fv03:  ldc.r4     8.25
     IL_fv04:  ldc.i4.0
     IL_fv05:  ldc.i4.3
     IL_fv06:  ldc.i4.0
     IL_fv07:  newobj     instance void [System.Drawing]System.Drawing.Font::.ctor(string,
                                                                                   float32,
                                                                                   valuetype [System.Drawing]System.Drawing.FontStyle,
                                                                                   valuetype [System.Drawing]System.Drawing.GraphicsUnit,
                                                                                   unsigned int8)
     IL_fv08:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Font(class [System.Drawing]System.Drawing.Font)
//tahoma end


运行如下诡异语句编译:
F:\Program Files\VideoTools\pspvideo9\dump>ilasm pspvideo9.il /resource:pspvideo9.res /output:../pspvideo9_n.exe
得到的pspvideo9_n.exe成功变成tahoma shimashita,哦也

这个程序作者的电脑上,GUI_FONT貌似是MS Sans Serif,修改后,字宽正确了,字高有些高(看那个工具栏处),琢磨不需逐个setsize的办法ing
User Posted Image
这个是加上了字体的:
User Posted Image

PS:那作者,偶给他反映Toolbar错位,还专门给他解释默认值不存储原则,根本不理,哎
不像doom9一样,MeGUI现在都是Tahoma了,嘿嘿
离线曾半仙

发帖
2409
金钱
20
威望
2
只看该作者 21 发表于: 2005-07-05
那个咳咳~~点小图,看大图了啊~~

(强烈抗议论坛缩图,放自己网站上也缩,昏特)

"Tahoma,8.25 -> Tahoma,8."以后,工具栏的高度也变回来了,Tahoma 8的字高也类似普通C程序的tahoma 8字高了(经过放大测量8.25确实高一些)

User Posted Image
离线决斗
发帖
2068
金钱
0
威望
0
只看该作者 22 发表于: 2005-07-05
半仙果然强人也!
本来我在想:对反编译的 il 文件,应该是可以自行修改、增加、删减代码来 DIY 软件,看来可行的。

如果给某个窗体单独加字体代码,比如:MessageBox
是否可加在 .maxstack 4 后面,或前面?
你说 .maxstack 增大一些,是指将 4 增大?增大多少数值以什么作为依据呢?
如下这段代码:
CODE

.method private hidebysig instance void
           aboutItem_Click(object sender,
                           class [mscorlib]System.EventArgs e) cil managed
   {
     // 代码大小       34 (0x22)
     .maxstack  4
     IL_0000:  ldstr      "WinMD5 "
     IL_0005:  ldsfld     string WinMD52.WinMD5Form::version
     IL_000a:  ldstr      ", (C) 2003-2004 by Edwin Olson (eolson@mit.edu)\r\n\r"
     + "\nFor more information, please visit our website:\r\nhttp://www.blisstonia"
     + ".com/software\r\n\r\nYou may freely distribute this application, but you ma"
     + "y not charge for it."
     IL_000f:  call       string [mscorlib]System.String::Concat(string,
                                                                 string,
                                                                 string)
     IL_0014:  ldstr      "About"
     IL_0019:  ldc.i4.0
     IL_001a:  ldc.i4.0
     IL_001b:  call       valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string,
                                                                                                                                                        string,
                                                                                                                                                        valuetype [System.Windows.Forms]System.Windows.Forms.MessageBoxButtons,
                                                                                                                                                        valuetype [System.Windows.Forms]System.Windows.Forms.MessageBoxIcon)
     IL_0020:  pop
     IL_0021:  ret
   } // end of method WinMD5Form::aboutItem_Click
Nearby or far apart, friends are always close in heart.......
离线曾半仙

发帖
2409
金钱
20
威望
2
只看该作者 23 发表于: 2005-07-05
加在所有.xxxx
的后面,也就是原来的IL_0000和}之间
他是按照语句放置的顺序执行,不需要计算指令长度然后修改增加出来的字节数的,跳转什么使用的标号,都不用改变
maxstack size应该和使用到的堆大小,我猜测是和传参or局部变量的个数有关,连续出现ldarg等没有call的越多,maxstack size越大.
推算了一下,要加字体的话,应该是如果小与7一定要改为7吧.
ld(ldstr/ldarg/ldc/lcfld)什么的应该只占一个size,new什么的也要占一个
计算到call,callvirt为止.
离线曾半仙

发帖
2409
金钱
20
威望
2
只看该作者 24 发表于: 2005-07-05
在32位计算机上,是32bit 4byte.
那么如果有使用QWORD或者什么双精度64bit浮点数作参数的话,就得顶2个size
il 指令,ilasm参数什么的说明,是不是应该在MSDN的framework sdk有资料呢?
光靠说书的烧乌龟壳来那得烧到何时啊
我是坚定的反.net派,MSDN里面没装.net有关的分类
一直也没有编过.net程序,你使用spy类的软件spy一下窗体,如果是WindowsForms10之类的类名,应该可以加字体的.
猜那个maxstack计法费了不少时间,差点因此放弃标号论,咳咳
离线决斗
发帖
2068
金钱
0
威望
0
只看该作者 25 发表于: 2005-07-05
试了下,对偶来说:难
Nearby or far apart, friends are always close in heart.......
离线Vanlentz
发帖
151
金钱
0
威望
0
只看该作者 26 发表于: 2005-07-05
这么麻烦?要是程序没有使用混淆器的话,直接用Reflector反编译到源代码,然后修改不就行了?
离线曾半仙

发帖
2409
金钱
20
威望
2
只看该作者 27 发表于: 2005-07-05
用UE打开,在winmd5.il中搜索
CODE
[System.Windows.Forms]System.Windows.Forms.Control::set_Name(string)

直到看到#3247:
CODE
     IL_0c7f:  ldarg.0
     IL_0c80:  ldstr      "WinMD5Form"
     IL_0c85:  call       instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Name(string)

就在这句前面,插入设置字体代码,成为
CODE
     IL_0c7a:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::set_MinimumSize(valuetype [System.Drawing]System.Drawing.Size)
     //tahoma start
     IL_fv01:  ldarg.0
     IL_fv02:  ldstr      "Tahoma"
     IL_fv03:  ldc.r4     8.
     IL_fv04:  ldc.i4.0
     IL_fv05:  ldc.i4.3
     IL_fv06:  ldc.i4.0
     IL_fv07:  newobj     instance void [System.Drawing]System.Drawing.Font::.ctor(string,
                                                                                   float32,
                                                                                   valuetype [System.Drawing]System.Drawing.FontStyle,
                                                                                   valuetype [System.Drawing]System.Drawing.GraphicsUnit,
                                                                                   unsigned int8)
     IL_fv08:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Font(class [System.Drawing]System.Drawing.Font)
//tahoma end
     IL_0c7f:  ldarg.0
     IL_0c80:  ldstr      "WinMD5Form"
     IL_0c85:  call       instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Name(string)

离线曾半仙

发帖
2409
金钱
20
威望
2
只看该作者 28 发表于: 2005-07-05
To 27楼的Vanlentz兄,建议您下载一个reflector用一下.
离线决斗
发帖
2068
金钱
0
威望
0
只看该作者 29 发表于: 2005-07-06
半仙果然是半仙,高!
主界面我照着试了,果然试验成功。

不知道此法对于 MessageBox 窗体是否可行?
因为我上面问的一个关于界面是个 MessageBox 。
Nearby or far apart, friends are always close in heart.......