C 如何检查当前登录会话期间是否已执行程序?(窗口)

C 如何检查当前登录会话期间是否已执行程序?(窗口),c,windows,spawn,spawning,C,Windows,Spawn,Spawning,在我正在开发的应用程序(在C中)中,在执行主应用程序之前,必须先运行加载器应用程序。我这样做是为了让主应用程序在启动时以子应用程序的身份运行loader应用程序,以便自动化此任务。这一切都很好,除了在用户当前登录会话期间,加载器应用程序只需要运行一次,主应用程序才能正常工作,而且每次主应用程序执行时都要运行加载器应用程序是一件非常痛苦的事情。所以我要问的是:有没有一种方法可以检查加载程序是否已经使用一些Windows或C功能运行过? 理想情况下,这样的事情会很棒,尽管我不知道这是否可能: if(

在我正在开发的应用程序(在C中)中,在执行主应用程序之前,必须先运行加载器应用程序。我这样做是为了让主应用程序在启动时以子应用程序的身份运行loader应用程序,以便自动化此任务。这一切都很好,除了在用户当前登录会话期间,加载器应用程序只需要运行一次,主应用程序才能正常工作,而且每次主应用程序执行时都要运行加载器应用程序是一件非常痛苦的事情。所以我要问的是:有没有一种方法可以检查加载程序是否已经使用一些Windows或C功能运行过? 理想情况下,这样的事情会很棒,尽管我不知道这是否可能:

if(thisapp.exe hasBeenExecuted)
    return;
else
    spawnl(app_path, app_name, args, NULL);
或者让主应用程序创建一个虚拟文件,在加载程序运行时充当标志。然后在后续执行时,检查文件是否存在,如果不存在,则运行加载程序。唯一的问题是自动化,这样当计算机关闭时,虚拟文件就会被删除(有没有办法做到这一点?)

一些澄清: 我无法编辑加载器应用程序或在主应用程序中复制其功能,我没有编写它


提前感谢您的帮助

有几种方法可以做到这一点

您的应用程序可以将条目添加到。这保证了在用户登录时,每个会话至少运行一次。在这种情况下,您可以向它传递一个特殊的命令行参数,以区分它与重新启动


另一个选项是将您的状态存储在当前用户配置单元中,并使用该标志创建密钥。这会导致密钥仅存储在内存中,并且在卸载配置单元时不会刷新到磁盘,而卸载配置单元时应该是用户注销的时候。

我以前看到的一个建议是在加载时从用户配置单元(即注册表)运行应用程序,删除您的文件(或者创建它)。优点是,这可以像shell脚本(批处理文件)一样简单,它在启动期间运行(或用户配置文件加载,取决于钩子的位置),并且在大多数情况下应该运行一次(启动时或用户登录时)。如果您选择登录,则每次用户注销后登录到计算机时都可以(将)运行登录

您也可以在用户注销时执行此操作,尽管这有点不太可靠,因为在卸载配置单元时,您并不总是知道机器的状态(可能会崩溃、断电等)

这并不是一种完全可靠的方法,而且它只能在windows上工作,但在大多数正常的使用场景下也能工作

作为另一种技巧,您可以将时间戳写入文件,当您加载时,获取时间戳并检查它是否小于当前用户登录的时间。如果是,则可以跳过加载,因为加载很可能发生在当前用户会话期间


同样,这也有一些缺点,但它也应该工作得相当好。

您也可以使用atom函数,而不必读/写一个庞大的文件


加载器应用程序的作用是什么,这意味着它需要首先运行


在我看来,正确的答案是检查是否已经完成,因为这才是你真正关心的。其他任何东西都可能是脆弱的,在角落里会破裂。

我以前使用互斥锁实现过这一点

例如:

int main( int argc, char argv[][] )  
{
    // if Mutex exists
    // {
    //     Don't allow a second instance to run:
    //     Notify user, log something, etc.
    //     return 0;
    // }
    // else
    // {
    //     Create Mutex, this is the first time running
    // }

    // Rest of your program runs from here . . .
}

-bn

这非常有效,谢谢!这在Windows XP中运行得很好,但是你知道在任何其他Windows发行版中功能是否发生了改变吗?我猜win32的东西在NT以上版本中也是一样的。在赢得3.x之前一直有atom的东西,但我不记得是否有不同的参数。试试这个(在XP中仍然可以正常工作)