如何在Windows重新启动之前只运行一次代码?

时间:2017-12-15 14:55:56

标签: c# windows

我确信其他人之前已经问过这样的问题,但我没有找到答案,所以如果有人能帮助我,我真的很感激。

我正在使用一些具有相当奇怪驱动程序的设备。当我尝试在一个Windows会话期间多次初始化Windows时,此驱动程序会破坏Windows。 但是应用程序可以在一个会话期间多次关闭和重新启动。所以我必须知道驱动程序是否已经初始化。 现在我正在创造空的"鬼"驱动初始化后的进程。 每当应用程序重新启动时,我都会检查此进程是否存在,并根据此信息决定是否初始化驱动程序。

我认为我目前处理此类问题的方式非常糟糕。 有没有其他方法可以处理它?<​​/ p>

3 个答案:

答案 0 :(得分:1)

第一:
你说过&#34; 我尝试多次初始化&#34;,这意味着你至少初始化一次。为什么不在初始化时添加注册表项?下次只检查此注册表项的值,并相应地决定是否重新初始化它。

第二:
如果Windows注册表不是一个选项,那么还有其他地方,如App Data文件夹或您自己的app文件夹,您可以在其中使用SQLite数据库来存储初始化状态并相应地做出决定。

答案 1 :(得分:0)

这完全取决于您是否能够确定自上次重启以来是否已执行初始化。这个驱动程序初始化后会做什么?它是否会改变应用程序可以评估的状态?

如果没有,您的应用程序需要在某处设置此状态,例如:

  • 正在运行的流程,正如您现在所做的那样。
  • Windows注册表中的更改。
  • 修改硬盘上的文件。

使用任务计划程序在Windows启动时,任何非易失性更改都可以取消。

答案 2 :(得分:0)

我建议您使用一些可以让您实现目标的解决方法,而无需在纯Matlab环境下执行复杂的开发任务。解决方法意味着使用system function。您没有指定操作系统,因此我们假设您位于Windows

之下

初始化你的驱动程序并保存初始化日期时间(应用程序文件夹中的mat文件,应用程序数据文件夹中的二进制文件,注册表项等等...你有多个选择,所有这些都很好)使用内置的now函数。

下次您的应用程序尝试初始化驱动程序时,在继续之前,尝试从注册表,文件或您决定使用的任何内容恢复上一个驱动程序初始化日期时间。如果信息不可用,则表示您的应用程序从未运行过,因此您可以安全地初始化驱动程序。否则,您必须将其与上次操作系统启动时间进行比较。在Windows下,您可以按以下方式获取此信息:

[status,cmdout] = system('wmic os get lastbootuptime');

如果status等于0,则cmdout变量将包含以下内容:

LastBootUpTime
20171201163757.330911+060

解析它以检索命令输出的数字部分,这是一个日期时间值。最后,将上次初始化与上次启动时间进行比较:如果前者在后者之前,则必须再次初始化驱动程序。