У меня есть два приложения Windows, каждый - сервис окон, которые создают EventWaitHandle и ожидают его. Второе приложение является окнами gui, которые открывают его путем вызова EventWaitHandle. OpenExisting () и попытка Установить событие. Но я получаю исключение в OpenExisting. Исключением является "Доступ к пути, отклонен".
Служебный код окон
EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName");
wh.WaitOne();
Код Windows GUI
try
{
EventWaitHandle wh = EventWaitHandle.OpenExisting("MyEventName");
wh.Set();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Я попробовал тот же код двумя демонстрационными консольными приложениями, он хорошо работал.
Вам необходимо использовать версию конструктора EventWaitHandle , который принимает экземпляр EventWaitHandleSecurity . Например, следующий код должен работать (он не тестировался, но, надеюсь, поможет вам начать):
// create a rule that allows anybody in the "Users" group to synchronise with us
var users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
var rule = new EventWaitHandleAccessRule(users, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify,
AccessControlType.Allow);
var security = new EventWaitHandleSecurity();
security.AddAccessRule(rule);
bool created;
var wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName", out created, security);
...
Кроме того, если вы работаете в Vista или более поздней версии, вам необходимо создать событие в глобальном пространстве имен (то есть префикс имени с "Global \"). Вам также придется сделать это в Windows XP, если вы используете функцию «Быстрое переключение пользователей».
Это может быть вызвано тем, что процесс службы работает с повышенным уровнем привилегий, а процесс графического интерфейса - нет. Если вы поместите один и тот же код в два консольных приложения, они оба будут работать на уровне пользователя, и у них не будет проблем с доступом к именованным общим объектам друг друга.
Попробуйте запустить приложение с графическим интерфейсом пользователя с флагом «Запуск от имени администратора» в меню «Пуск» Windows. Если это решит проблему, вам нужно прочитать, как запросить повышение в вашем коде. (Я этого не делал)