Delphi 了解资源的数量
delphixe,Win7x64 要请求具有已知编号的字符串资源,请执行以下操作:Delphi 了解资源的数量,delphi,Delphi,delphixe,Win7x64 要请求具有已知编号的字符串资源,请执行以下操作: Function GuGetStrRes(Fn:string;Nom:integer):string; var h:THandle; buffer:array [0..255] of Char; begin Result:=''; if fileexists(Fn)=false then exit; Try h:=LoadLibraryEx(pchar(Fn),0,LOAD
Function GuGetStrRes(Fn:string;Nom:integer):string;
var
h:THandle;
buffer:array [0..255] of Char;
begin
Result:='';
if fileexists(Fn)=false then
exit;
Try
h:=LoadLibraryEx(pchar(Fn),0,LOAD_LIBRARY_AS_DATAFILE);
if h=0 then
exit;
if LoadString(h, Nom, buffer, SizeOf(buffer)) > 0 then
Result:=string(buffer);
FreeLibrary(h);
Except
Try
if h<>0 then
FreeLibrary(h);
except
end;
End;
End;
// Use
Showmessage(GuGetStrRes('c:\windows\system32\shell32.dll',4200));
但由于某种原因,当i:=4201
:()时,它会导致一个错误(即使设计尝试除外也没有帮助)
当
i=0..4200
和>4210
时,一切正常。要枚举资源字符串,必须使用传递RT\u字符串类型的函数
检查一下这个样品
{$APPTYPE CONSOLE}
uses
Classes,
Windows,
SysUtils;
function EnumResNameProc(hModule : THandle; lpszType, lpszName : PChar; lParam : longint) : boolean; stdcall;
var
Id : LongInt;
Min : Integer;
Max : Integer;
Index : Integer;
Buffer : PWChar;
Stream : TResourceStream;
Len : Word;
begin
if Longint(lpszName)<65535 then
begin
Id:= longint(lpszName);
Writeln(Format('RT_STRING ID %d',[Id]));
Min:=(Id - 1) * 16;
Max:=(Id * 16) - 1;
Stream:=TResourceStream.CreateFromID(hModule,Id,RT_STRING);
try
Buffer:=Stream.Memory;
for Index:=Min to Max do
begin
//determine the length of the string
Len:=Word(Buffer^);
if Len>0 then
begin
Writeln(Format(' String ID %d',[Index]));
Inc(Buffer,Len+1);
end
else
Inc(Buffer);
end;
finally
Stream.Free;
end;
end
else
Writeln(string(lpszName));
Result := true;
end;
procedure EnumerateStringResources(const FileName:string);
var
hModule : Thandle;
restype : byte;
begin
hModule := LoadLibraryEx(PChar(FileName), 0, LOAD_LIBRARY_AS_DATAFILE);
if hModule=0 then exit
else
try
EnumResourceNames(hModule, RT_STRING, @EnumResNameProc, 0);
finally
FreeLibrary(hModule);
end;
end;
begin
try
EnumerateStringResources('YourApplication.exe');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.
更新
我更新了答案以反映字符串表中的字符串id,字符串以16个为一组进行分组。因此,第一个包包含字符串0到15,第二个包包含字符串16到31,依此类推。因此,可以通过这种方式确定计算字符串id的公式
Min:=(Id - 1) * 16;
Max:=(Id * 16) - 1;
有关更多信息,您可以阅读Raymond Chen的这篇文章“它导致错误”在不确切知道错误和错误消息的情况下没有任何意义。请编辑您的帖子并提供这些信息;我们可以更轻松(更快)地提供帮助如果我们有它。如果这是您尝试过的代码,那么它不起作用也就不足为奇了。它甚至无法编译!“如果fileexists(Fn)=false then”,真的吗?请放在一边。不要使用try/except来管理生命周期。使用try/finally。感谢您的想法,在这里仍然有帮助:@NGLN,是的,当需要false
时,可能会返回意外的TRUE
(布尔值从不扩展为LongBool)
RT_STRING ID 4080
String ID 65264
String ID 65265
String ID 65266
String ID 65267
String ID 65268
String ID 65269
String ID 65270
String ID 65271
String ID 65272
String ID 65273
String ID 65274
String ID 65275
String ID 65276
String ID 65277
String ID 65278
String ID 65279
RT_STRING ID 4081
String ID 65280
String ID 65281
String ID 65282
String ID 65283
String ID 65284
String ID 65285
String ID 65286
String ID 65287
String ID 65288
String ID 65289
String ID 65290
String ID 65291
String ID 65292
String ID 65293
String ID 65294
String ID 65295
Min:=(Id - 1) * 16;
Max:=(Id * 16) - 1;