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