2010-03-01 70 views
1

在我正在开发的应用程序中(在C中),必须首先在主应用程序执行前运行加载器应用程序。我已经做到了,主应用程序在启动时运行加载器应用程序,以便自动完成此任务。这一切都运行良好,除了加载器应用程序只需要在用户当前的登录会话期间运行一次以便主应用程序正常工作,并且每次主应用程序执行时都必须运行该应用程序才是真实的疼痛。所以我问的是:有没有办法检查加载程序是否已经使用Windows或C功能运行? 理想情况下是这样的将是巨大的,虽然我不知道,如果它甚至有可能:如何检查当前登录会话期间是否已执行程序? (Windows)

if(thisapp.exe hasBeenExecuted) 
    return; 
else 
    spawnl(app_path, app_name, args, NULL); 

或者可能像其主要的应用程序创建的运行程序的时候,充当一个标志,一个虚拟文件。然后在后续执行中,检查文件是否存在,如果没有则运行加载程序。唯一的问题是将其自动化,以便在关闭计算机时删除虚拟文件(是否有办法执行此操作?)。

一些说明: 我不能编辑加载器应用程序或在主应用程序中复制其功能,我没有写它。

在此先感谢您的帮助

回答

1

您也可以使用原子功能,而无需读/写一个巨大的文件

http://msdn.microsoft.com/en-us/library/ms649053%28VS.85%29.aspx

+0

这完美地工作,谢谢!这在Windows XP中运行良好,但是您是否知道在其他Windows版本中功能是否发生了变化? –

+0

我猜测win32的东西在NT上是一样的。原子一直回到Win 3.x,但我不记得是否有不同的参数。 试试这个(应该仍然在XP下工作) http://ghirai.com/hutch/files/win32hlp_big.zip –

2

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

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

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

0

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

你也可以在用户注销时做到这一点,尽管这样做的可靠性要差一些,因为当配置单元卸载时(它可能会崩溃,没电等),你并不总是知道机器的状态。

它不是一个完整的证明方式,它只会在Windows上工作,但在大多数正常使用情况下,它会工作。

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

再次,这有一些缺点,但它应该工作得很好。

0

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

在我看来,正确的答案是检查是否已完成,因为这就是你真正关心的。其他任何事情都可能是脆弱的,并在角落案件中破裂。

0

我已经在过去使用互斥量来实现这一点。

例如:

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

相关问题