注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

珠海渔郎之电子网档

项目管理 + 程序开发 + Delphi + 电脑应用 + 数码 + 进化感悟

 
 
 

日志

 
 

[转帖]英文系统的乱码及问号问题  

2009-10-18 04:54:54|  分类: 电脑应用 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

作者aCheng:

在英文系统中,往往会遇到乱码及问号问题
一.显示乱码时:
一种是没字库,
如:刚装完的英文系统,没装上中文的语言支持时,就会这样.

一种是有语言支持,但Language for non-Unicode不对(控制面板里的语言的高级里面的Language for non-Unicode),
如:你当前设成简体的,要运行繁体的程序时候的乱码(如:明星三缺一).
解决:
1.把系统默认的改掉.
2.内码转换:如《Microsoft Applocale》
http://d7.games.sina.com.cn/tools_1024/Applocale_tools_03_10_03.zip
二.当显示为问号时,且Language for non-Unicode是对的.
这时就是程序的问题:
比如:delphi7在中文系统编译出来的在英文系统就会显示?号.(delphi6 不会)
解决:在程序代码中加上
  SetThreadLocale($0804);//$0804 为简体的codepage ,$0404://tranditional chinese:
对于不能重编译的程序,只能对其注入打补丁.
参数这篇VC的代码
http://www.cnblogs.com/hBifTs/articles/4521.html,我转成DELPHI的
http://agu.datas.googlepages.com/LocalePatch.rar,方便我自己做补丁程序.
使用了QueueUserAPC,直接用CreateRemoteThread好像不行,原因不知,哪个高手告知下.
delphi代码如下:
type
  apc=packed record locale:LCID;p: function (Locale: LCID): BOOL; stdcall;end;pApc=^apc;
  procedure RemoteFun(_ap:pApc);stdcall; begin _ap^.p(_ap^.locale); end;
  procedure FunAfter ; begin end;
  procedure SetLocale(aProcess,aThread,aLocale:Cardinal);
  var  vCodeSeg,vDataSeg:Pointer; vAp:apc;lpNumberOfBytesWritten: DWORD;
  begin
    vCodeSeg := pDWORD(VirtualAllocEx(aProcess,nil,Integer(@FunAfter)-Integer(@RemoteFun),MEM_COMMIT, PAGE_EXECUTE_READWRITE ));
    vDataSeg :=pApc(VirtualAllocEx(aProcess,nil,SizeOf(vAp),MEM_COMMIT, PAGE_READWRITE ));
    with vAp do begin locale :=aLocale;@p:=GetProcAddress(GetModuleHandle('kernel32'),'SetThreadLocale'); end;
    WriteProcessMemory(aProcess,vCodeSeg,@RemoteFun,Integer(@FunAfter)-Integer(@RemoteFun),lpNumberOfBytesWritten);
    WriteProcessMemory(aProcess,vDataSeg,@vAp,SizeOf(vAp),lpNumberOfBytesWritten);
    QueueUserAPC(vCodeSeg,aThread,DWORD(vDataSeg));
  end;

procedure PatchFile(aFilename:String;aLocale:Cardinal=$0804);
  var
    vStartupInfo:TStartupInfo;
    vProcessInfo:TProcessInformation;
    vDir:string;
  begin
    FillChar(vStartupInfo,SizeOf(vStartupInfo),#0);
    vStartupInfo.cb:=SizeOf(vStartupInfo);
    vStartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
    vStartupInfo.wShowWindow:=SW_SHOWNORMAL;
    vDir:=ExtractFilePath(aFileName);
    if DirectoryExists(vDir) then  ChDir(ExtractFilePath(aFileName));
    if CreateProcess(nil,PChar(aFilename),nil,nil,False,CREATE_SUSPENDED,nil,nil,vStartupInfo,vProcessInfo) then
    begin
      SetLocale(vProcessInfo.hProcess,vProcessInfo.hThread,aLocale);
      ResumeThread(vProcessInfo.hThread);
      CloseHandle(vProcessInfo.hThread);
      CloseHandle(vProcessInfo.hProcess);
    end;
  end;

这个补丁程序能解决的我机子的问题:
1.VM的绿色汉化版(显示?)
2.MiniCD(显示?)
3.delphi imageen 在英文系统的乱码
4.delphi7在英文系统不能用中文输入法录入中文,只能COPY,PASTE来录入中文
5.以前在Delphi7写的程序
6.其它部分小工具的(?号)

  评论这张
 
阅读(479)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017