【问题标题】:Ok to use VirtualProtect to change resource in Delphi?可以使用 VirtualProtect 更改 Delphi 中的资源吗?
【发布时间】:2010-02-09 14:22:17
【问题描述】:

我正在 D2010 中进行一项简单的本地化工作。我正在处理表单上的所有字符串,因为 ETM 似乎对我的需求有点过头了,其他 3rd 方工具也是如此......(虽然我现在不太确定!)

以下用于更改 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;

【问题讨论】:

    标签: delphi


    【解决方案1】:

    是的,应该没问题,但是我有一些cmets:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 确实如此。它具有非常相似的代码来挂钩资源字符串加载。或者干脆使用它!
      • 安德烈:谢谢你的建议。我可能会回到 dggettext,但对于合并这么多代码,如果它坏了我将无法调试,我有点害怕。谢谢,mghie,也是。我一直很感激您的意见。
      • 我理解那种“闷骚”的感觉,但是 dxgettext 被很多需要它完美工作的人使用。如果有 180 个人在使用它,那就是 180 个眼球在看那个代码,而只有一组(你的)在看你的代码。有时,我们从错误中吸取了错误的教训。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多