Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat