【问题标题】:How can a program change its own resources?程序如何改变自己的资源?
【发布时间】:2011-10-19 00:27:32
【问题描述】:

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

【问题讨论】:

  • 这不是您通常管理设置的方式。请问为什么不想要一个外部的XML文件?设置 XML 文件应保存在 %APPDATA%/CompanyName/ProductName/ProductVersion 中。您还可以使用注册表来保存数据。对于驻留在 USB 大容量存储设备上的便携式应用程序,您应该将 XML 文件保存在 USB 设备上的 EXE 文件旁边。如果出于某种奇怪的原因,您确实需要更改“嵌入式”XML,您可能需要第二个可执行文件
  • 不要这样做。将设置放在单独的文件中。
  • 即使很容易实现,但如果用户无权修改可执行文件(只有具有管理员权限的用户才应该拥有),它是行不通的,默认情况下程序文件目录有这样的设置。不仅您不应该修改可执行文件,而且您不应该将 xml 文件写入与 exe 相同的文件夹中(用户可能无法写入)。从安全的角度来看,未受保护的可执行文件使系统易受攻击。
  • 我看到了问题...我只是从 mac 的角度考虑将所有东西都放在一个自包含的包中,带有 plist 等的便利。我猜 mac .app 包不是不过确实是一个二进制文件,所以这是另一回事。我只是喜欢自包含、可移植的可执行文件的想法,但也许我会使用单独的文件

标签: delphi resources delphi-xe2


【解决方案1】:

答案是肯定的和否定的。

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

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

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

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

您可以采用多种策略来实现您想要的 - 或者足够接近它以使您满意的策略。哪个最合适取决于您的具体需求。

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 控制台应用可以自行删除吗? (如果没有,控制台应用程序可以启动主可执行文件并带有一个标志,告诉它删除控制台应用程序然后终止。)
    • 我不完全确定。我知道批处理文件可以自行删除。但也许它们是特殊情况。
    • 我刚试了一下,还是不行。批处理文件不是可执行程序或进程。相反,它是一个由真正的可执行程序(一个真正的进程)解释的“脚本”。
    • 如果你试过了,@Andreas,你还不够努力:Can a program delete its own executable?
    • 但问题是:用户可以删除可执行文件吗?在适当的设置系统中,答案是否定的。
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 2011-01-19
    • 2016-01-14
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多