程序如何改变自己的资源?

时间:2011-10-19 00:27:33

标签: delphi resources delphi-xe2

我想将一些XML程序首选项存储为Delphi应用程序中的资源。将根据用户更改修改资源。我创建XML并将其作为资源加载没有问题,并且可以修改我加载它的xmlDocument,但我不知道如何编写文档。这甚至可能吗?我不想最终得到2个文件(.exe和.xml)。

2 个答案:

答案 0 :(得分:2)

答案是肯定和否定。

是的,可以使用Windows API例程更新二进制文件中的资源。 This link to BeginUpdateResource()可以让你在这个分数上走上正确的轨道。

但是,您将在使用BeginUpdateResource()时注意以下条件:

  

“用于更新资源的二进制文件。应用程序必须是   能够获得对该文件的写访问权限;引用的文件   pFileName当前无法执行。“

换句话说,应用程序无法在运行时简单地更新自己的资源。

您可以采用多种策略来实现您想要的目标 - 或者足够接近它以使其满意的策略。哪种方式最合适取决于您的确切需求。

在众多解决方案中,有两个可能是:

1)维护DLL中的所有此类资源(仅限资源的DLL - 不包含实际代码),只有在专门加载资源(或更新资源)时才打开它们。因此,当您希望将资源写回DLL时,您应该能够获得所需的写锁定。

2)当您需要更新资源时,将当前运行的EXE重命名为“myapp.OLD”之类的内容,复制它以便您拥有一个当前名称为“myapp.exe”的新文件。然后,您可以更新“myapp.exe”,因为它实际上是“myapp.old”正在执行。

这第二种方法非常混乱并且具有“难闻的气味”,但是例如自动更新器常用(或曾经)的技术。如果当前运行的代码要使用修改后的EXE中的更新资源,显然会在某些时候重启您的应用程序,因此可能不适合您的需求。

答案 1 :(得分:1)

还需要考虑的是反病毒软件可能会将活动标记为可疑。

考虑Deltics的回答我认为您还可以创建一个控制台应用程序,将您的资源写回主exe。因此,您的主exe将其更改保存到文件中,并提取控制台应用程序。当主应用程序终止时,它会调用控制台应用程序。控制台应用程序等待一小段时间,然后将资源文件绑定到主可执行文件,删除资源文件及其自身。控制台应用程序可以检查以确保资源文件已成功写入,如果没有,则保持资源文件打开。主要可执行文件可以在启动时查看资源文件并使用它而不是嵌入文件 - 作为安全措施。

所有这些都假设一个用户应用程序。