【问题标题】:A Function in an application(.exe) should be called only once regardless of how many times I run the same application无论我运行同一个应用程序多少次,应用程序(.exe)中的函数都应该只调用一次
【发布时间】:2021-01-04 16:23:00
【问题描述】:

假设有两个函数,一个打印“hello”,另一个打印“world”,我在主函数中调用这两个函数。现在,当我编译它时,它会创建一个 .exe 文件。当我第一次运行这个 .exe 时,这两个函数都会打印“hello world”。这个 .exe 被终止了。

但如果我第二次或多次运行相同的.exe,则只需执行一个函数,即。它应该只打印“世界”。我想要一段只应该运行一次的代码或函数,之后它应该会自行销毁,并且无论我运行多少次应用程序(.exe)都不应再次执行

我可以通过访问本地或windows注册表来实现这一点,并一次写入一些值,并且可以检查该值是否存在,无需执行这段代码或函数。

我可以在没有任何外部帮助的情况下实现应用程序本身应该能够执行此行为吗? 任何想法表示赞赏。感谢阅读

【问题讨论】:

  • 您可以这样做的唯一方法是修改可执行文件以设置值。这样的构造是非常系统特定的并且很可能是脆弱的。最好将状态存储在外部文件中。
  • 你需要在某个地方存储一些状态——比如在文件或数据库中或其他任何地方——你的程序会检查它,看看它是否已经运行过一次。否则,程序的每次执行都知道该程序的任何先前执行。除非您专门编写代码来创建和检查此类持久性内存,否则程序没有先前运行的“内存”。
  • 为什么要写一个自毁程序?
  • @KevinBoone 好吧,我的应用程序在更新时,我的 ApplicationUpgrader.exe 第一次删除了一些文件。然后在第二次更新期间,我不希望 ApplicationUpgrader.exe 删除这些文件。我唯一的解决方案是在第一次更新期间在注册表中写入值并检查第二次更新中是否存在值。好吧,我想避免这些步骤,并在第一次更新时为其编写一次性代码。
  • 我认为比让程序自行修改更简洁的解决方案是为其配备足够的逻辑来计算每次执行时需要执行的步骤。

标签: c++ c visual-studio


【解决方案1】:

没有连贯的或可移植的方式1从软件中做到这一点而不需要使用某种外部资源。

问题是您希望此进程的调用知道它已执行的次数,但它已执行的次数不是记录在任何地方的属性2支持>。除非您对其进行编程,否则程序本身不会对其先前的执行进行记忆。

最好的办法是在某个规范化的位置写出这些信息,以便以后执行时可以读取。这可以是文件系统中的一个文件(例如隐藏的 .firstrun 文件或其他东西),也可以是通过注册表(特定于 Windows)或其他一些特定于环境的通信形式。

主要的是,这必须在执行之间持续存在并且可供您的流程使用。


1可以在第一次调用后编写覆盖可执行文件本身的代码——但这非常脆弱,并且将高度特定于可执行文件格式。这不是解决此问题的理想方法,也不推荐。

2 这不是 C 或 C++ 标准中定义的功能。可能有一些专门的操作系统/Linux风格允许查询这个——但这在大多数通用操作系统中是看不到的。通常,该方法是通过外部资源进行通信。

【讨论】:

    【解决方案2】:

    我可以在没有应用程序本身的任何外部帮助的情况下实现它吗 应该能够执行此行为吗?

    绝不是由 C 或 C++ 定义的,而且可能根本不在 Windows 上。

    您必须以某种方式在某个地方纪念一次性函数已被调用的事实。如果您只有编译后的程序可供使用,那么唯一的选择就是修改程序。 C 和 C++ 都不提供对正在运行的程序进行实时修改,更不用说将其写回包含其映像的可执行文件。

    可以想象,如果程序知道在哪里找到或如何重新创建自己的源代码,并且如果它知道如何运行编译器,那么它可以编译自己的修改版本。然而,在 Windows 上,它很可能无法在运行时覆盖自己的可执行文件(尽管这在其他各种操作系统上都是可能的),所以这并不能解决问题。

    此外,请注意,任何涉及修改可执行文件的方法都至少有点不稳定,因为程序的不同副本对于一次性函数是否已运行有自己的、半独立的想法。

    那么,基本上没有。

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 2012-08-11
      • 2023-03-05
      • 2014-06-28
      相关资源
      最近更新 更多