![]() |
LoadResource statt LoadString, aber wie?
Hiermit lese ich die WideStringVersionen der ResourceStrings aus den Resourcen der Anwendung aus:
Delphi-Quellcode:
Aufgerufen wird's z.B. so:
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;
Delphi-Quellcode:
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,
ResourceString RS = '...';
Var S: WideString; LoadResString(@RS, S); LoadLangResString(@RS, S); wo also per ANSI ausgelesen und dieses dann in Unicode umgewandelt wird. Also von den ursprünglichen UnicodeInfos ist danach nicht mehr viel übrig.
Delphi-Quellcode:
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 :cry: Das ist so der wichtigste Teil, meiner verwirrten Gedankengänge:
Delphi-Quellcode:
Na ja, wie gesagt, ich bekomme halt aus dem Identifier keinen ResourceNamen raus, mit dem FindResourceEx auch was anfangen kann :cry:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz