c++ - 无论我运行同一个应用程序多少次,应用程序(.exe)中的函数都应该只调用一次
问题描述
假设有两个函数,一个打印“hello”,另一个打印“world”,我在 main 函数中调用这两个函数。现在,当我编译它时,它会创建一个 .exe 文件。当我第一次运行这个 .exe时,两个函数都会打印“hello world”。这个 .exe 被终止。
但是,如果我第二次或多次运行相同的 .exe,则只需执行一个函数,即。它应该只打印“世界”。我想要一段只应该运行一次的代码或函数,之后它应该会自行销毁,并且无论我运行应用程序多少次都不应再次执行(.exe)
我可以通过访问本地或 Windows 注册表来实现这一点,并一次写入一些值,然后可以检查该值是否存在,无需执行这段代码或函数。
我可以在没有任何外部帮助的情况下实现它,即应用程序本身应该能够执行此行为吗?任何想法表示赞赏。谢谢阅读
解决方案
在不需要使用某种外部资源的情况下,没有连贯的或可移植的方式1从软件中执行此操作。
问题是您希望此过程的调用知道它已执行的次数,但它已执行的次数不是记录在任何地方的属性2。除非您对其进行编程,否则程序本身不会对其先前的执行进行记忆。
最好的办法是在某个规范化的位置写出这些信息,以便在以后的执行中读取它。这可能是文件系统中的一个文件(例如隐藏.firstrun
文件或其他东西),也可能是通过注册表(特定于 Windows)或其他一些特定于环境的通信形式。
主要的是,这必须在执行之间持续存在并且可供您的流程使用。
1您可能会编写在第一次调用后覆盖可执行文件本身的代码——但这非常脆弱,并且将高度特定于可执行文件格式。这不是解决此问题的理想方法,也不是推荐方法。
2这不是 C 或 C++ 标准中定义的功能。可能有一些专门的操作系统/Linux风格允许查询这个——但这在大多数通用操作系统中是看不到的。通常,该方法是通过外部资源进行通信。
推荐阅读
- angular - 如何在 Angular2+ 的 Crud 模块中设置没有 setTimeout 的动态国家、州和城市?
- java - WebSphere - 无法加载 Logmanager “org.apache.logging.log4j.jul.LogManager”
- java - Bind existence of a value in ObservableSet to property
- html - Angular7 - 使用函数刷新搜索栏(输入范围)的问题
- symfony - 使用 Symfony Serializer 时如何修复 DateTimeNormalizer 问题
- c# - 是否应该在交易处理完毕后返回?
- android - 在 PageViewer 中应用之前如何使用 Glide 减小图像大小?
- node.js - 如何在不创建 Azure 应用(在应用注册处)的情况下对 Azure AD 中的用户进行身份验证?
- php - 如何修复 Laravel 中的“函数 App\Http\Controllers\..\Controller::edit() 的参数太少,通过 0 并且预期正好 1”错误
- c - C CORTEX-M4:如何访问 UART (vcom) 发送的 uint8_t 数据为 int32_t