C ++ изменить ресурсы во время выполнения - PullRequest
7 голосов
/ 04 декабря 2008

Можно ли программно редактировать ресурсы для исполняемого файла во время выполнения? Если так, то как? Если нет, есть ли другая программа, которую можно легко использовать для изменения ресурсов?

Спасибо, Дерек.

1 Ответ

1 голос
/ 22 февраля 2017

Да, это возможно, хотя и не особенно легко. В основном это требует написания компилятора ресурсов (по крайней мере для типов ресурсов, которые вы хотите изменить).

Например, я однажды написал компилятор меню, который выводил свои данные из базы данных во время выполнения (затем сохранял результат обратно в БД). Если исходные таблицы не изменились, использовался существующий ресурс, в противном случае он был перестроен.

В случае ресурсов меню (и, я полагаю, диалогов), хитрый момент заключается в том, что некоторые элементы присутствуют только в зависимости от настроек флага, а также от строгих требований выравнивания.

В случае изменения ресурсов, уже присутствующих в вашем .exe, вам необходимо скопировать данные ресурса в буфер памяти (с дополнительным пространством, доступным, если вы добавляете новые элементы) (используя FindResource, LockResource, затем копию памяти UnlockResource).

После внесения изменений вы затем используете одну из косвенных функций создания (т. Е. CreateMenuIndirect) и передаете адрес буфера.

API ресурса позволяет записывать такой буфер обратно в двоичный файл приложения, но это нарушит сигнатуру, если вы используете подпись кода, поэтому будьте очень осторожны. Я также не знаю, работает ли этот API для программы, которая на самом деле работает.

...