Delphi 一个程序如何改变它自己的资源?

Delphi 一个程序如何改变它自己的资源?,delphi,resources,delphi-xe2,Delphi,Resources,Delphi Xe2,我想将一些XML程序首选项作为资源存储在Delphi应用程序中。资源将根据用户更改进行修改。我可以创建XML并将其作为资源加载,并且可以修改加载到其中的xmlDocument,但是我不知道如何写回文档。这可能吗?我不希望最后有两个文件(.exe和.xml)。答案是肯定和否定 是的,可以使用Windows API例程以二进制形式更新资源。应该能让你在这方面走上正轨 但是,在使用BeginUpdateResource()时,您会注意到以下条件: “用于更新资源的二进制文件。应用程序必须是 能够获得对

我想将一些XML程序首选项作为资源存储在Delphi应用程序中。资源将根据用户更改进行修改。我可以创建XML并将其作为资源加载,并且可以修改加载到其中的xmlDocument,但是我不知道如何写回文档。这可能吗?我不希望最后有两个文件(.exe和.xml)。

答案是肯定和否定

是的,可以使用Windows API例程以二进制形式更新资源。应该能让你在这方面走上正轨

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

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

换句话说,应用程序在运行时不可能简单地更新自己的资源

你可以采用多种策略来实现你想要的——或者是接近你想要的、令人满意的东西。哪一个最合适取决于你的确切需求

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

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

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


第二种方法非常混乱,有一种“难闻的气味”,但这是一种(或过去)自动更新程序非常常用的技术。显然,如果当前运行的代码是为了使用修改后的EXE中更新的资源,则在某个时候需要重新启动应用程序,因此它可能不适合您的需要。

答案是肯定和否定的

是的,可以使用Windows API例程以二进制形式更新资源。应该能让你在这方面走上正轨

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

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

换句话说,应用程序在运行时不可能简单地更新自己的资源

你可以采用多种策略来实现你想要的——或者是接近你想要的、令人满意的东西。哪一个最合适取决于你的确切需求

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

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

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


第二种方法非常混乱,有一种“难闻的气味”,但这是一种(或过去)自动更新程序非常常用的技术。显然,如果当前运行的代码是使用修改后的EXE中更新的资源,那么在某个时间点将重新启动应用程序,因此它可能不适合您的需要。

< P>其他的要考虑的是,反病毒软件可能将活动标记为可疑。 考虑到Deltics的答案,我认为您还可以创建一个控制台应用程序,将资源写回主exe。因此,主exe将其更改保存到一个文件中,并提取控制台应用程序。当主应用程序终止时,它调用控制台应用程序。控制台应用程序等待一小段时间,然后将资源文件绑定到主可执行文件,删除资源文件及其自身。控制台应用程序可以进行检查,以确保资源文件已成功写入,如果未成功写入,请保持资源文件处于打开状态。主可执行文件可以在启动时看到资源文件,并使用它来代替嵌入的文件——作为保护措施


所有这些假设都是一个单用户应用程序 考虑到Deltics的答案,我认为您还可以创建一个控制台应用程序,将资源写回主exe。因此,主exe将其更改保存到一个文件中,并提取控制台应用程序。当主应用程序终止时,它调用控制台应用程序。控制台应用程序等待一小段时间,然后将资源文件绑定到主可执行文件,删除资源文件及其自身。控制台应用程序可以进行检查,以确保资源文件已成功写入,如果未成功写入,请保持资源文件处于打开状态。主可执行文件可以在启动时看到资源文件,并使用它来代替嵌入的文件——作为保护措施


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

这不是您通常管理设置的方式。我可以问一下为什么不需要外部XML文件吗?设置XML文件应保存在
%APPDATA%/CompanyName/ProductName/ProductVersion
中。您还可以使用注册表保存数据。对于USB大容量存储设备上的便携式应用程序,应将XML文件保存在EXE fi旁边