delphi - 可以使用 VirtualProtect 更改 Delphi 中的资源吗?

标签 delphi

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

相关文章:

delphi - 通用列表和重复记录

delphi - 如何在不使用外部 DLL 或运行时的情况下压缩和加密大文件?

delphi - 从函数返回 OleVariant 会导致对所包含的 IDispatch 对象产生无法释放的额外引用

delphi - 如何获取某个目录的父文件夹的路径?

delphi - 需要在delphi中的Word/Excel文档中添加/设置读取/获取CustomDocumentProperties

delphi - 当 vcl 样式激活时,如何为我的应用程序的消息框设置外观?

delphi - 使用继承的对象列表

delphi - 从另一个表单访问 DataModule 上的事件

Delphi字符串泄漏

Delphi:快速(呃)宽字符串连接