可以使用VirtualProtect在Delphi中更改资源吗?

时间:2010-02-09 14:22:17

标签: delphi

我正在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;

2 个答案:

答案 0 :(得分:4)

是的,它应该没问题,但我有一些意见:

  • 确保一次仅从一个线程调用HookResourceString函数。如果两个线程同时调用它,则最终可能会恢复错误的权限。

  • 同样对于多线程,请确保在某些其他线程可能尝试加载资源字符串时不使用此代码。 LoadResString两次读取Identifier字段,并且两次都需要具有相同的值。

  • 无需将新值声明为 typed 常量。普通的真常数很好。 (编译器知道它们需要是PChars,因为它们是作为PChar参数的实际参数传递的。)

答案 1 :(得分:1)

为什么不使用dxgettext?这是开源的,所以你至少可以看看他们是如何做到的...... http://dxgettext.po.dk/