Локализованные строковые значения для строк размера КБ, МБ, ГБ и т. Д.? - PullRequest
0 голосов
/ 07 апреля 2019

Где хранятся эти ресурсы strins в Windows? Мне нужно показать размер ядра на родном языке установленной Windows.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Это возможно с библиотекой дисковых квот, которая доступна с 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;
0 голосов
/ 10 апреля 2019

Строки очень специфичны для приложения, которое его использует.В окнах нет общего поиска строки, который может использовать приложение.Конечно, вы можете написать программу для поиска ресурса в папке Windows, чтобы увидеть, в каком dll ресурса есть искомая строка, а затем использовать этот dll ресурса в вашем приложении, но это нежелательно.Причина в том, что любое новое обновление окон, которое вносит изменения в dll ресурса, может сломать ваше приложение.

Как советует другой автор, вам лучше написать свой собственный dll ресурса и локализовать его на языки, которыеВы хотите поддержать свое приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...