AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi LoadResource statt LoadString, aber wie?
Thema durchsuchen
Ansicht
Themen-Optionen

LoadResource statt LoadString, aber wie?

Ein Thema von himitsu · begonnen am 31. Mai 2006
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.159 Beiträge
 
Delphi 12 Athens
 
#1

LoadResource statt LoadString, aber wie?

  Alt 31. Mai 2006, 11:48
Hiermit lese ich die WideStringVersionen der ResourceStrings aus den Resourcen der Anwendung aus:
Delphi-Quellcode:
Procedure LoadResString(ResStringRec: PResStringRec; Var S: WideString);
  Var Instance: LongInt;

  Begin
    If ResStringRec = nil Then S := ''
    Else If ResStringRec^.Identifier <= $0000FFFF Then Begin
      Instance := FindResourceHInstance(ResStringRec^.Module^);
      SetLength(S, LoadStringW(Instance, ResStringRec^.Identifier, nil, 0));
      LoadStringW(Instance, ResStringRec^.Identifier, PWideChar(S), Length(S) + 1);
    End Else S := PAnsiChar(ResStringRec^.Identifier);
  End;
Aufgerufen wird's z.B. so:
Delphi-Quellcode:
ResourceString RS = '...';
Var S: WideString;

LoadResString(@RS, S);
LoadLangResString(@RS, S);
folgendes geht ja nur für AnsiStrings, da D7 immer nur LoadResString (Unit System) aufruft, was nur die ANSI-Version ausließt, selbst wenn das Ergebnis an einen WideString gehen soll,
wo also per ANSI ausgelesen und dieses dann in Unicode umgewandelt wird. Also von den ursprünglichen UnicodeInfos ist danach nicht mehr viel übrig.
S := RS;

Das klappt och wunderbar, aber nun wolle ich mal selber Einfluß darauf nehmen in welcher Sprache der String ausgelesen wird.

Mein letzer Gedanke ging also in Richtung FindResourceEx, wo man auch die LangID mit angeben kann, aber da hab ich noch nicht rausgefunden, wie ich nur über den Identifier an den String rankomme

Das ist so der wichtigste Teil, meiner verwirrten Gedankengänge:
Delphi-Quellcode:
Procedure FindLangResource(Var Data: TData);
  Function EnumStringModules(Instance: LongInt; Data: Pointer): Boolean;
    Var R: HRSRC;
      P: Pointer;

    Begin
      Result := True;
      R := FindResourceExA(Instance, RT_STRING, PAnsiChar(PData(Data)^.Identifier), PData(Data)^.LangID);
      //R := FindResourceExA(Instance, RT_STRING, PAnsiChar(IntToStr(PData(Data)^.Identifier)), PData(Data)^.LangID);
      //weder Binär, noch als String geht es
      If R <> 0 Then Begin
        P := LoadResource(PData(Data)^.Instance, R);
        If P <> nil Then Exit;
      End Else Exit;
      PData(Data)^.Instance := Instance;
      PData(Data)^.Found := True;
      Result := False;
    End;

  Var Func: TEnumModuleFunc;
    i: Integer;

  Begin
    Func := @EnumStringModules;
    Data.Found := False;
    For i := 0 to 2 do
      If LangData^.LangID[i] <> 0 Then Begin
        Data.LangID := LangData^.LangID[i];
        EnumResourceModules(Func, @Data);
        If Data.Found Then Exit;
      End;
    For i := 0 to 2 do
      If LangData^.LangID[i] and Lang_PrimaryMask <> 0 Then Begin
        Data.LangID := LangData^.LangID[i] and Lang_PrimaryMask;
        EnumResourceModules(Func, @Data);
        If Data.Found Then Exit;
      End;
    Data.LangID := 0;
    EnumResourceModules(Func, @Data);
  End;

Procedure LoadLangResString(Identifier: LongInt; Var S: WideString);
  Var Data: TData;
    R: HRSRC;
    P: Pointer;
    i: Integer;

  Begin
    Data.Identifier := Identifier;
    FindLangResource(Data);
    If Data.Found Then Begin
      R := FindResourceExW(Data.Instance, RT_STRING, PAnsiChar(Data.Identifier), Data.LangID);
      P := LoadResource(Data.Instance, R);
      If P <> nil Then Begin
        i := SizeOfResource(Data.Instance, R) div 2;
        SetLength(S, i);
        CopyMem(P, @S[1], i * 2);
      End;
    End Else S := '';
  End;

Procedure LoadLangResString(ResStringRec: PResStringRec; Var S: WideString);
  Begin
    If ResStringRec^.Identifier <= $0000FFFF Then LoadLangResString(ResStringRec^.Identifier, S)
    Else S := PAnsiChar(ResStringRec^.Identifier);
  End;
Na ja, wie gesagt, ich bekomme halt aus dem Identifier keinen ResourceNamen raus, mit dem FindResourceEx auch was anfangen kann
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz