1

在我正在开发的应用程序中(用 C 语言),加载器应用程序必须首先运行,然后才能执行主应用程序。我已经做到了,所以主应用程序在启动时将加载程序应用程序作为子应用程序运行,以便自动执行此任务。这一切都很好,除了加载器应用程序只需要在用户当前登录会话期间运行一次以使主应用程序正常工作,并且每次主应用程序执行时都必须运行它是一个真实的痛。所以我要问的是:有没有办法检查加载程序是否已经使用某些 Windows 或 C 功能运行?理想情况下,这样的事情会很棒,尽管我不知道它是否可能:

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

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

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

提前感谢您的帮助

4

5 回答 5

2

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

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

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

于 2010-03-01T21:56:52.313 回答
1

您还可以使用原子函数而无需读取/写入一个巨大的文件

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

于 2010-03-01T22:00:00.487 回答
0

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

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

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

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

同样,这也有一些缺点,但它也应该可以很好地工作。

于 2010-03-01T21:59:19.500 回答
0

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

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

于 2010-03-01T22:04:45.553 回答
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

于 2010-03-01T22:19:45.243 回答