Как я могу проверить, была ли программа уже выполнена во время текущего сеанса входа? (Windows) - PullRequest
1 голос
/ 02 марта 2010

В приложении, которое я разрабатываю (в C), приложение-загрузчик должно быть сначала запущено перед выполнением основного приложения. Я сделал так, чтобы основное приложение запускало приложение загрузчика, когда оно запускалось, чтобы автоматизировать эту задачу. Все это работает хорошо, за исключением того факта, что приложение загрузчика нужно запускать только один раз во время текущего сеанса входа пользователя в систему, чтобы основное приложение работало правильно, и необходимость запускать его каждый раз, когда основное приложение выполняется боль. Итак, я спрашиваю: есть ли способ проверить, был ли загрузчик уже запущен с использованием некоторой функциональности Windows или C? В идеале что-то вроде этого было бы замечательно, хотя я понятия не имею, возможно ли это:

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

Или, может быть, что-то наподобие того, как основное приложение создает фиктивный файл, который действует как флаг при запуске загрузчика. Затем при последующих выполнениях проверяем, существует ли файл, и запускаем загрузчик, если его нет. Единственная проблема заключается в том, что он автоматизирован, поэтому фиктивный файл стирается при выключении компьютера (есть ли способ сделать это?).

Некоторые уточнения: Я не могу редактировать приложение загрузчика или копировать его функциональность в основном приложении, я его не написал.

Заранее спасибо за любую помощь

Ответы [ 5 ]

2 голосов
/ 02 марта 2010

Есть несколько способов сделать это.

Ваше приложение может добавить запись в Клавиша запуска . Это гарантирует, что он будет запускаться как минимум один раз за сеанс, когда пользователь входит в систему. В этом случае вы можете передать ему специальную командную строку arg, чтобы отличить ее от повторного запуска.

Другим вариантом может быть сохранение вашего состояния в текущем кусте пользователя и создание ключа с флагом REG_OPTION_VOLATILE . Это приводит к тому, что ключ хранится только в памяти и не будет записан на диск при выгрузке куста, что должно происходить при выходе пользователя из системы.

1 голос
/ 02 марта 2010

Вы также можете использовать функции атома, не читая и не записывая огромный файл

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

0 голосов
/ 02 марта 2010

Я реализовал это в прошлом, используя Mutex.

Например:

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

0 голосов
/ 02 марта 2010

Что делает приложение-загрузчик, это значит, что его нужно запустить первым?

Мне кажется, правильный ответ - проверить и убедиться, что это было сделано, потому что это то, что вас действительно волнует. Все остальное может быть хрупким и сломаться в угловых случаях.

0 голосов
/ 02 марта 2010

Одним из предложений, которое я видел ранее, является запуск приложения из куста пользователей (т.е. реестра) при загрузке, который удаляет ваш файл (или, альтернативно, создает его). Преимущество заключается в том, что это может быть просто скрипт оболочки (пакетный файл), который запускается во время запуска (или загрузки профиля пользователя, в зависимости от того, где вы подключаетесь) и в большинстве случаев должен запускаться один раз (либо при запуске, либо при входе пользователя в систему). ). Если вы выбрали логин, он может (будет) запускаться каждый раз, когда пользователь входит в систему после выхода из системы.

Вы также можете сделать это при выходе пользователя из системы, хотя это несколько менее надежно, поскольку вы не всегда знаете состояние машины при разгрузке улья (она может быть разбита, отключена и т. Д.).

Это не полный способ доказательства, и он будет работать только на Windows, но при большинстве сценариев обычного использования он будет работать.

В качестве альтернативы вы можете записать временную метку в файл, а при загрузке получить временную метку и проверить, меньше ли она времени, в течение которого текущий пользователь вошел в систему. Если это так, то вы можете пропустить загрузку, так как она наиболее вероятно произошла во время текущего сеанса пользователя.

Опять же, у этого есть некоторые недостатки, но это должно работать достаточно хорошо.

...