gpt4 book ai didi

delphi - 学习资源数量

转载 作者:行者123 更新时间:2023-12-03 18:15:02 25 4
gpt4 key购买 nike

Delphi Xe, 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));

问题:如何学习DLL中的所有'string'资源?比如接收一个数组:11,22,23,24,40000等等(不能一个接着一个)

这样试过:

...
var
dllname, str:string;
begin
dllname: ='c:\windows\system32\shell32.dll';
str: = ";
For i: = 0 to 10000 do
begin
str: = GuGetStrRes (dllname, i);
if str <> " then
memo1.lines.add (inttostr (i) + ' - ' +str);
end;
end;

但由于某些原因它会导致错误(即使设计 try-except 也无济于事),当 i: = 4201 :(当i=0..4200>4210时,一切正常。

最佳答案

要枚举资源字符串,您必须使用 EnumResourceNames传递 RT_STRING 类型的函数。

检查此示例。

{$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.

根据你的资源,输出会像这样

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

更新我更新了答案以反射(reflect)字符串表中的字符串 id,字符串以 16 个为一组组合在一起。因此第一个包包含字符串 0 到 15,第二个包包含字符串 16 到 31,依此类推。所以计算字符串id的公式可以这样确定

Min:=(Id - 1) * 16;
Max:=(Id * 16) - 1;

有关更多信息,您可以阅读 Raymond Chen 的这篇文章 The format of string resources

关于delphi - 学习资源数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6499930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com