Winapi 大小字符串KB、MB、GB等的本地化字符串值。?
Windows上存储的strins资源在哪里?Winapi 大小字符串KB、MB、GB等的本地化字符串值。?,winapi,localization,Winapi,Localization,Windows上存储的strins资源在哪里? 我需要在已安装Windows的本机语言上正确显示大小。字符串对于使用它的应用程序非常特定。windows中没有应用程序可以使用的通用字符串资源。当然,您可以编写一个程序来搜索windows文件夹中的资源,以查看哪个资源dll具有您要查找的字符串,然后在应用程序中使用该资源dll,但这是不可取的。原因是,任何引入资源dll更改的新窗口更新都可能破坏应用程序 正如另一张海报所建议的,您最好编写自己的资源dll,并将其本地化为您希望支持应用程序的语言。这
我需要在已安装Windows的本机语言上正确显示大小。字符串对于使用它的应用程序非常特定。windows中没有应用程序可以使用的通用字符串资源。当然,您可以编写一个程序来搜索windows文件夹中的资源,以查看哪个资源dll具有您要查找的字符串,然后在应用程序中使用该资源dll,但这是不可取的。原因是,任何引入资源dll更改的新窗口更新都可能破坏应用程序
正如另一张海报所建议的,您最好编写自己的资源dll,并将其本地化为您希望支持应用程序的语言。这可以通过Windows XP提供的磁盘配额库实现:
function FindStringResourceEx(AInstance: HINST; AStringID: UINT; ALangID: UINT): PWideChar;
var
Res: HRSRC;
LoadedRes: HGLOBAL;
I: Integer;
begin
Result := nil;
Res := FindResourceEx(AInstance, RT_STRING, MAKEINTRESOURCE(AStringID div 16 + 1), ALangID);
if Res <> 0 then begin
LoadedRes := LoadResource(AInstance, Res);
if LoadedRes <> 0 then
try
Result := PChar(LockResource(LoadedRes));
if Assigned(Result) then
try
for I := 0 to (AStringID and 15) - 1 do
Inc(Result, PWord(Result)^ + 1);
finally
UnlockResource(THandle(Result));
end;
finally
FreeResource(LoadedRes);
end;
end;
end;
function GetSizeStrings(out sBytes, sKB, sMB, sGB, sTB, sPB, sEB: string): Boolean;
var
hLib: HMODULE;
sRes: string;
I: Integer;
SL: TStringList;
begin
Result := False;
hLib := LoadLibrary('dskquoui.dll');
if hLib > 0 then
try
SL := TStringList.Create;
try
sRes := FindStringResourceEx(hLib, 14472, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
Result := sRes <> '';
if Result then begin
sRes := sRes.Remove(0, 1);
I := sRes.IndexOf(#$B);
if I > -1 then
sRes := sRes.Remove(I);
SL.Delimiter := #2;
SL.DelimitedText := sRes;
sBytes := SL[0]; // bytes
sKB := SL[1]; // KB
sMB := SL[2]; // MB
sGB := SL[3]; // GB
sTB := SL[4]; // TB
sPB := SL[5]; // PB
sEB := SL[6]; // EB
end;
finally
SL.Free;
end;
finally
FreeLibrary(hLib);
end;
if not Result then begin
sBytes := 'bytes';
sKB := 'KB';
sMB := 'MB';
sGB := 'GB';
sTB := 'TB';
sPB := 'PB';
sEB := 'EB';
end;
end;
函数FindStringResourceEx(AInstance:HINST;AStringID:UINT;ALangID:UINT):PWideChar;
变量
Res:HRSRC;
负载体:HGLOBAL;
I:整数;
开始
结果:=无;
Res:=findresourcex(AInstance,RT_字符串,MAKEINTRESOURCE(AStringID div 16+1),ALangID);
如果为0,则开始
LoadedRes:=LoadResource(AInstance,Res);
如果加载为0,则
尝试
结果:=PChar(locksource(LoadedRes));
如果分配(结果),则
尝试
对于I:=0到(AStringID和15)-1 do
Inc(结果),PWord(结果)^+1;
最后
解锁资源(THandle(Result));
终止
最后
免费资源(已加载资源);
终止
终止
终止
函数GetSizeStrings(输出sBytes、sKB、sMB、sGB、sTB、sPB、sEB:string):布尔值;
变量
hLib:HMODULE;
sRes:字符串;
I:整数;
SL:TStringList;
开始
结果:=假;
hLib:=LoadLibrary('dskquoi.dll');
如果hLib>0,则
尝试
SL:=TStringList.Create;
尝试
sRes:=FindStringResourceEx(hLib,14472,MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL));
结果:=sRes';
如果有结果,那么开始
sRes:=sRes.Remove(0,1);
I:=sRes.IndexOf(#$B);
如果我>-1,那么
sRes:=sRes.移除(I);
SL.分隔符:=#2;
SL.DelimitedText:=sRes;
sBytes:=SL[0];//字节
sKB:=SL[1];//KB
sMB:=SL[2];//兆字节
sGB:=SL[3];//国标
机顶盒:=SL[4];//结核病
sPB:=SL[5];//PB
sEB:=SL[6];//电子束
终止
最后
SL.免费;
终止
最后
免费图书馆(hLib);
终止
如果没有结果,则开始
sBytes:=“字节”;
sKB:=“KB”;
sMB:=“MB”;
新加坡元:=‘GB’;
机顶盒:=‘TB’;
sPB:=‘PB’;
sEB:=‘EB’;
终止
终止
是什么让您认为这些字符串存储在您可以访问的资源中?您应该本地化自己的字符串,而不是使用OS中的字符串。CLDR包含您需要的信息。每个区域设置都有一条规则,如何使用K、M、G等,然后CLDR包含每个因素的本地化名称,包括长名称和短名称。请记住,有些语言不适用于数千人,但例如10000人的(日语)@Jaska谢谢你的信息,我会读到这篇文章