此约束资源在哪里存储在Windows上? 我需要以已安装的Windows的本机语言来显示大小。
答案 0 :(得分:0)
字符串非常特定于正在使用它的应用程序。应用程序可以使用的Windows中没有通用的字符串资源。当然,您可以编写一个程序来搜索Windows文件夹中的资源,以查看哪个资源dll具有要查找的字符串,然后在应用程序中使用该资源dll,但这是不可取的。原因是,对Windows进行的任何新更新都会导致资源dll更改,从而破坏您的应用程序。
正如另一位发布者建议的那样,最好编写自己的资源dll并将其本地化为要支持应用程序的语言。
答案 1 :(得分:0)
这是可以使用的磁盘配额库(自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;