Различное поведение объекта события в Windows XP и Windows 7 - PullRequest
3 голосов
/ 27 мая 2011

В моей программе на C ++ / winapi я использую объект события, чтобы определить, запущен ли экземпляр моего приложения, чтобы не допустить запуска второго экземпляра.

Но в то же время я хочуразрешить запуск нескольких экземпляров программы, если они запущены с использованием другой учетной записи пользователя.Например, используя команду "runas".(То есть: для каждой учетной записи пользователя только 1 экземпляр может работать одновременно)

Я использую код, который выглядит следующим образом:

HANDLE hSingleInstance=OpenEvent(EVENT_MODIFY_STATE,FALSE,
                                   "Local\\SingleInstanceEventName");
if(hSingleInstance!=NULL) {
  // there is an instance already running
  SetEvent(hSingleInstance);// let know the 1st instance that we are trying to start
  CloseHandle(hSingleInstance);
  return 0; // exit the program
}
else {
  // this is the 1st instance
  hSingleInstance=CreateEvent(NULL,FALSE,FALSE, "Local\\SingleInstanceEventName");
}

Он работает, как и ожидалось в XP - я могу запустить только1 экземпляр, использующий одну и ту же учетную запись пользователя, и я могу запустить несколько экземпляров, используя несколько учетных записей пользователей.

Но в Windows 7 функция OpenEvent () всегда «находит» мой объект события, даже если объект события созданиспользуя другую учетную запись пользователя.Из-за этого я не могу запустить несколько экземпляров, используя разные учетные записи пользователей (по желанию).

Что я должен изменить в своем коде, чтобы разрешить запуск нескольких экземпляров с использованием разных учетных записей пользователей в Windows 7?Или, может быть, мой подход совершенно неправильный, тогда какой из них правильный?

спасибо

Ответы [ 2 ]

1 голос
/ 27 мая 2011

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

В Vista есть некоторые тонкие изменения;концепция запуска чего-то «приподнятого» вносит дополнительную складку;это похоже, но не совсем то же самое, что и запуск под другим пользователем.Некоторые ресурсы пропущены по причинам, связанным с совместимостью - я не могу вспомнить, если события / мьютексы относятся к этой категории.

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

Как уже упоминалосьв одном из других ответов, если вы хотите сделать это для каждого пользователя (но все еще в рамках одного и того же сеанса), вам нужно дать свои события для каждого пользователя: добавьте имя пользователя к базовому имени события, и выдолжно быть сделано.

1 голос
/ 27 мая 2011

Все, что вам нужно сделать, это как-то включить имя пользователя в название события.Я, честно говоря, немного удивлен, что ваш сценарий работал в XP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...