Ich mache das so:
Delphi-Quellcode:
var
StringPointerList : array of Pointer;
{$WARNINGS OFF}
procedure CleanStringPointerList;
var
i : integer;
begin
for i := Low(StringPointerList) to High(StringPointerList) do
begin
// Uiii... prüfen auf memoryleak in > 2009
StrDispose(PAnsiChar(StringPointerList[i]));
end;
SetLength(StringPointerList, 0);
end;
procedure HookResourceString(ResStringRec: pResStringRec; NewStr: PChar);
var
OldProtect: DWORD;
begin
VirtualProtect(ResStringRec, SizeOf(ResStringRec^), PAGE_EXECUTE_READWRITE, @OldProtect);
ResStringRec^.Identifier := Integer(NewStr);
VirtualProtect(ResStringRec, SizeOf(ResStringRec^), OldProtect, @OldProtect);
end;
procedure SetSysResStr(AConstant : Pointer; const AConstantName : string);
var
p : PChar;
begin
// Das ggf. an die benutzte Delphi-Version anpassen
{$IFDEF VER250}
p := StrNew(PWideChar(LocalizerOnFly.GetTraslatedRS(AConstantName)));
{$ELSE}
p := StrNew(PChar(WideStringToString(LocalizerOnFly.GetTraslatedRS(AConstantName),0)));
{$ENDIF}
SetLength(StringPointerList, High(StringPointerList)+2);
StringPointerList[High(StringPointerList)] := p;
HookResourceString(AConstant, p);
end;
finalization
CleanStringPointerList;
Und Aufruf dann
SetSysResStr(@SMsgDlgError, 'SMsgDlgError');
Wenn Du etwas anderes als Localizer einsetzt, kannst Du das
LocalizerOnFly.GetTraslatedRS(AConstantName) entsprechend abändern und z.b. den Text als Konstante reingeben