Как программа может изменить свои собственные ресурсы? - PullRequest
0 голосов
/ 19 октября 2011

Я хотел бы сохранить некоторые настройки программы XML в качестве ресурса в приложении Delphi.Ресурс будет изменен в зависимости от пользовательских изменений.У меня нет проблем с созданием XML и загрузкой его в качестве ресурса, и я могу изменить xmlDocument, в который я его загружаю, но я не знаю, как записать документ обратно.Это вообще возможно?Я бы предпочел, чтобы в итоге не было 2 файла (.exe и .xml).

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Ответом может быть как да, так и нет.

Да, можно обновлять ресурсы в двоичном формате с помощью подпрограмм Windows API. Эта ссылка на BeginUpdateResource () должна привести вас на правильный путь в этом счете.

Однако вы заметите следующее условие использования BeginUpdateResource ():

"Бинарный файл, в котором обновляются ресурсы. Приложение должно иметь возможность получить доступ для записи в этот файл; файл, на который ссылается pFileName, в настоящее время не может выполняться."

В другомДругими словами, приложение не может просто обновлять свои собственные ресурсы во время работы.

Существует ряд стратегий, которые вы можете использовать для достижения того, чего вы хотите - или чего-то достаточно близкого к этому, чтобы быть удовлетворительным.Что наиболее подходит, будет зависеть от ваших конкретных потребностей.

Из множества решений могут быть два:

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

или

2) Когда вам нужно обновить ресурс, переименуйте текущий запущенный EXE-файл в нечто вроде «myapp.OLD», скопируйте его, чтобы у вас был новый файл с текущим именем »myapp.exe».Затем вы можете обновить «myapp.exe», потому что на самом деле выполняется «myapp.old».

Этот второй подход довольно грязный и имеет «неприятный запах», но это метод (или используемыйбыть) довольно часто используется автообновлениями, например.Очевидно, что в какой-то момент потребуется перезапуск вашего приложения, если текущий запущенный код будет использовать обновленные ресурсы в измененном EXE, поэтому он может не соответствовать вашим потребностям.

1 голос
/ 19 октября 2011

Еще нужно учесть, что антивирусное программное обеспечение может помечать активность как подозрительную.

Думая об ответе Deltics, я подумал, что вы могли бы также создать консольное приложение, которое записывает ваш ресурс обратно в основной exe-файл. Таким образом, ваш основной исполняемый файл сохраняет свои изменения в файл, а также извлекает консольное приложение. Когда основное приложение завершает работу, оно вызывает консольное приложение. Консольное приложение ожидает в течение короткого периода времени, а затем привязывает файл ресурса к основному исполняемому файлу, удаляет файл ресурса и себя. Консольное приложение может выполнить проверку, чтобы убедиться, что файл ресурсов был успешно записан, и, если нет, оставить файл ресурсов открытым. Основной исполняемый файл может видеть файл ресурсов при запуске и использовать его вместо встроенного файла - в качестве меры безопасности.

Все это предполагает однопользовательское приложение.

...