Delphi 了解资源的数量

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

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_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;