Winapi 大小字符串KB、MB、GB等的本地化字符串值。?

Winapi 大小字符串KB、MB、GB等的本地化字符串值。?,winapi,localization,Winapi,Localization,Windows上存储的strins资源在哪里? 我需要在已安装Windows的本机语言上正确显示大小。字符串对于使用它的应用程序非常特定。windows中没有应用程序可以使用的通用字符串资源。当然,您可以编写一个程序来搜索windows文件夹中的资源,以查看哪个资源dll具有您要查找的字符串,然后在应用程序中使用该资源dll,但这是不可取的。原因是,任何引入资源dll更改的新窗口更新都可能破坏应用程序 正如另一张海报所建议的,您最好编写自己的资源dll,并将其本地化为您希望支持应用程序的语言。这

Windows上存储的strins资源在哪里?
我需要在已安装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谢谢你的信息,我会读到这篇文章