Хорошо, чтобы использовать VirtualProtect для изменения ресурса в Delphi? - PullRequest
1 голос
/ 09 февраля 2010

Я работаю над простой локализацией в 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 ]

4 голосов
/ 09 февраля 2010

Да, все должно быть хорошо, но у меня есть несколько комментариев:

  • Обязательно вызывайте функцию HookResourceString только из одного потока за раз. Если два потока вызывают его одновременно, вы можете восстановить неправильные разрешения.

  • Также для многопоточности убедитесь, что вы не используете этот код в то время, когда какой-то другой поток может пытаться загрузить строку ресурса. LoadResString читает поле Identifier дважды, и оно должно иметь одинаковое значение оба раза.

  • Нет необходимости объявлять новые значения как набранные константы. Обычные истинные константы в порядке. (Компилятор знает, что они должны быть PChars, потому что они передаются как фактические аргументы для параметра PChar.)

1 голос
/ 09 февраля 2010

Почему бы не использовать dxgettext? Это открытый исходный код, так что вы можете хотя бы взглянуть на то, как они это делают ...
http://dxgettext.po.dk/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...