我正在D2010进行简单的本地化工作。我正在处理表格上的所有字符串,因为ETM似乎对我的需求有点过分,就像其他第三方工具一样......(虽然我现在还不太确定!)
以下代码是否可以更改Const.pas字符串,以更改标准消息框上的按钮标签?
procedure HookResourceString(rs: PResStringRec; newStr: PChar);
var
oldprotect: DWORD;
begin
VirtualProtect(rs, SizeOf(rs^), PAGE_EXECUTE_READWRITE, @oldProtect);
rs^.Identifier := Integer(newStr);
VirtualProtect(rs, SizeOf(rs^), oldProtect, @oldProtect);
end;
const
NewOK: PChar = 'New Ok';
NewCancel: PChar = 'New Cancel';
Procedure TForm.FormCreate;
begin
HookResourceString(@SMsgDlgOK, NewOK);
HookResourceString(@SMsgDlgCancel, NewCancel);
end;
答案 0 :(得分:4)
是的,它应该没问题,但我有一些意见:
确保一次仅从一个线程调用HookResourceString
函数。如果两个线程同时调用它,则最终可能会恢复错误的权限。
同样对于多线程,请确保在某些其他线程可能尝试加载资源字符串时不使用此代码。 LoadResString
两次读取Identifier
字段,并且两次都需要具有相同的值。
无需将新值声明为 typed 常量。普通的真常数很好。 (编译器知道它们需要是PChars,因为它们是作为PChar参数的实际参数传递的。)
答案 1 :(得分:1)
为什么不使用dxgettext?这是开源的,所以你至少可以看看他们是如何做到的...... http://dxgettext.po.dk/