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

可以使用VirtualProtect在Delphi中更改资源吗?,delphi,Delphi,我正在D2010做一个简单的本地化工作。我正在处理表单上的所有字符串,因为ETM对于我的需求来说似乎太过分了,其他第三方工具也是如此。。。虽然我现在不太确定 下面更改Const.pas字符串的代码是否认为更改标准消息框上的按钮标签是安全的 procedure HookResourceString(rs: PResStringRec; newStr: PChar); var oldprotect: DWORD; begin VirtualProtect(rs, SizeOf(rs^), P

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

是的,应该可以,但我有一些意见:

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

此外,对于多线程,请确保在其他线程可能试图加载resourcestring时不使用此代码。LoadResString读取标识符字段两次,两次都需要具有相同的值

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


是的,应该可以,但我有一些意见:

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

此外,对于多线程,请确保在其他线程可能试图加载resourcestring时不使用此代码。LoadResString读取标识符字段两次,两次都需要具有相同的值

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


为什么不使用dxgettext?这是开源的,所以你至少可以看看他们是如何做到的。。。
为什么不使用dxgettext?这是开源的,所以你至少可以看看他们是如何做到的。。。
确实如此。它有非常相似的代码来钩住资源字符串加载。或者干脆用它!安德烈:谢谢你的建议。我可能会回到dggettext,但对于合并太多的代码,我有点害羞,因为如果代码中断,我将无法调试。谢谢你,米吉。我一直很感激你的意见。我理解那种黏糊糊的感觉,但是很多人使用dxgettext,他们需要它才能完美地工作。如果有180个人在使用它,那就是180个眼球在看代码,而只有一组人在看代码。有时,我们从错误中吸取了错误的教训-的确它有非常相似的代码来钩住资源字符串加载。或者干脆用它!安德烈:谢谢你的建议。我可能会回到dggettext,但对于合并太多的代码,我有点害羞,因为如果代码中断,我将无法调试。谢谢你,米吉。我一直很感激你的意见。我理解那种黏糊糊的感觉,但是很多人使用dxgettext,他们需要它才能完美地工作。如果有180个人在使用它,那就是180个眼球在看代码,而只有一组人在看代码。有时,我们从错误中吸取了错误的教训-