Ich habs
Der Trick liegt bei MS. Jede String-Resource ID verweist auf bis zu 16 Strings. Dadurch wird die Kapazität für verfügbare String Sourcen erhöht. Das ganze lässt sich dann wie folgt berechnen:
RealStringID = [$FFFF - ($1000 - EnumStringID) * 16 - $0F..$FFFF - ($1000 - EnumStringID) * 16 - $00];
Code:
function BuildResourceNameTable(const p_hFile : DWORD;const p_pszType : PChar;const p_pszName : PChar;const p_pLParam : TTreeNode) : Boolean; stdcall;
var
sName : string;
szBuffer : PChar;
i : integer;
offset : integer;
begin
if IS_INTRESOURCE(integer(p_pszName)) then
begin
sName := '#'+IntToStr(integer(p_pszName));
end
else
begin
sName := trim(p_pszName);
end;
if p_pszType = RT_STRING then
begin
if p_hFile <> 0 then
begin
szBuffer := StrAlloc(65536);
try
offset := $FFFF - (($1000 - integer(p_pszName)) shl 4);
for i := $0F downto $00 do
if Boolean(LoadString(p_hFile, offset - i, szBuffer, 65535)) then
TTreeView(p_pLParam.TreeView).Items.AddChild(p_pLParam, '#'+
IntToStr(offset-i) + ' / ' + Trim(szBuffer));
finally
StrDispose(szBuffer);
end;
end;
end
else
begin
TTreeView(p_pLParam.TreeView).Items.AddChild(p_pLParam,sName);
end;
Result := true;
end;