英文系统的乱码及问号问题
delphi7 编译出来的程序在英文xp下中文显示BUG
我用delphi7编译出来的程序在英文xp下中文全都显示为??
用delphi6编译出来的就不会,真奇怪。。。。
解答(acheng):
是delphi7的Bug
http://qc.borland.com/wc/qcmain.aspx?d=2460
解决:
uses Windows;
Application.Initialize;
// 设置本程序的区域语言
SetThreadLocale(DWORD(Word(SORT_DEFAULT) shl 16) or
DWORD(Word(SUBLANG_CHINESE_SIMPLIFIED) shl 10) or
DWORD(Word(LANG_CHINESE)));
在英文系统中,往往会遇到乱码及问号问题
一.显示乱码时:
一种是没字库,
如:刚装完的英文系统,没装上中文的语言支持时,就会这样.
一种是有语言支持,但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.其它部分小工具的(?号)