我正在 D2010 中进行简单的本地化工作。我正在处理表单上的所有字符串,因为 ETM 似乎超出了我的需求,其他第 3 方工具也是如此......(尽管我目前不太确定!)
下面用于更改 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;
最佳答案
是的,应该没问题,但我有一些意见:
确保一次仅从一个线程调用
HookResourceString
函数。如果两个线程同时调用它,您最终可能会恢复错误的权限。对于多线程,请确保在其他线程可能尝试加载资源字符串时不要使用此代码。
LoadResString
读取Identifier
字段两次,并且两次的值需要相同。无需将新值声明为类型化常量。普通的真常数就可以了。 (编译器知道它们需要是 PChar,因为它们作为 PChar 参数的实际参数传递。)
关于delphi - 可以使用 VirtualProtect 更改 Delphi 中的资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2229699/