I would like to store some XML program preferences as a resource in a Delphi application. The resource would be modified based on user changes. I have no problem creating the XML and loading it as a resource, and can modify the xmlDocument that I load it into, but I don’t know how to write the document back. Is this even possible? I would prefer not to end up with 2 files in the end (.exe and .xml).
Share
The answer is both yes and no.
Yes, it is possible to update resources in a binary using Windows API routines. This link to BeginUpdateResource() should get you on the right track on that score.
However, you will note the following condition on the use of BeginUpdateResource():
In other words, it is not possible for an application to simply update it’s own resources while running.
There are a number of strategies you could employ to achieve what you want – or something close enough to it as to be satisfactory. Which is most appropriate will depend on your precise needs.
Of the multitude of solutions, two might be:
1) Maintain all such resources in a DLL (resource only DLL – containing no actual code as such) which you open only when specifically loading resources (or updating them). Thus at the time you wish to write a resource back to the DLL you should be able to get the required write-lock.
or
2) When you need to update a resource rename the current running EXE to something like “myapp.OLD”, copy it so that you have a new file with the current name “myapp.exe”. You can then update “myapp.exe” because it is actually “myapp.old” that is executing.
This second approach is quite messy and has a “nasty smell” but is a technique that is (or used to be) quite commonly used by auto-updaters, for example. Obviously will involve a restart of your app at some point if the current running code is to make use of the updated resources in the modified EXE, so it may not be appropriate to your needs.