【问题标题】:Change Windows time using SetLocalTime() without rebooting使用 SetLocalTime() 更改 Windows 时间而不重新启动
【发布时间】:2019-06-22 11:48:53
【问题描述】:

我们正在建立一个嵌入式 Windows 系统,它需要具有更改系统日期和时间的功能。我们的系统不会像普通PC一样正常关机,而是用户直接断电。

问题出现在我们尝试使用SetLocalTime()等Win API函数(具有管理员权限)时,该函数刚刚执行时API成功,但是当用户重新启动机器时(即切断电源并打开它)再次),日期设置将恢复为之前的日期设置。看起来操作系统缓存了需要正常重启才能将设置存储到磁盘的设置。

有人知道如何在不重新启动操作系统的情况下立即“刷新数据缓存”吗?

非常感谢。

【问题讨论】:

  • 你的电脑没有 RTC?
  • 我们已经尝试过 SetSystemTime() 但仍然有同样的问题。
  • 我们的电脑有一个 RTC。我们也尝试使用普通的 Windows 10 操作系统重现此问题。在正常的 Win 10 操作系统中,选择“调整日期/时间”(“自动设置时间”和“自动设置时区”均已关闭),然后更改日期并切断 PC 电源。然后再次打开它,日期将重置回之前的日期...
  • “用户将直接断电”。解决真正的问题。个人电脑的设计不是这样关闭的。事实上,硬件设计明确地阻止了这一点。旧电脑有一个硬电源开关,但现代电脑有一个电源按钮,可以执行受控关机。

标签: c++ windows winapi clock


【解决方案1】:

您可以检查两种解决方法,看看是否有帮助:

  1. 更改 Windows 时间后,您明确执行重新启动,以使您的更改能够在用户直接切断电源之前写入磁盘。您可以使用以下 API 重启系统:

    ExitWindowsEx(EWX_REBOOT | EWX_FORCE, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_UPGRADE | SHTDN_REASON_FLAG_PLANNED)

    参考:“How to Shut Down the System

  2. Caching can be turned off for a file 通过将 FILE_FLAG_NO_BUFFERING 作为 CreateFile 的 dwFlagsAndAttributes 参数的值来打开。禁用缓存时,所有读写操作都直接访问物理磁盘。因此,您可以将时间存储在此类文件中,并在系统重新启动时读取并重新设置(Starting an Scheduled task on System Boot)。

【讨论】:

    猜你喜欢
    • 2018-04-12
    • 2013-08-28
    • 2019-03-23
    • 1970-01-01
    • 2017-12-03
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多