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