Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#6
  Alt 3. Dez 2002, 12:22
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;
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat