Создание перекрестного события EventWaitHandle
У меня есть приложение для Windows, одно из которых - это сервис Windows, который создает EventWaitHandle и ждет его. Второе приложение - это windows gui, который открывает его, вызывая EventWaitHandle.OpenExisting() и пытается установить событие. Но я получаю исключение в OpenExisting. Исключение: "Доступ к пути запрещен".
Окно Код службы
EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName");
wh.WaitOne();
Код графического интерфейса Windows
try
{
EventWaitHandle wh = EventWaitHandle.OpenExisting("MyEventName");
wh.Set();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Я попробовал тот же код с двумя примерами консольного приложения, он работал нормально.
Ответы
Ответ 1
Вам нужно использовать версию конструктор 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 или более поздней версии, вам нужно создать событие в глобальном пространстве имен (то есть префикс имени с именем "Глобальный" ). Вы также должны сделать это в Windows XP, если используете функцию "Быстрое переключение пользователей".
Ответ 2
Это может быть вызвано тем, что процесс обслуживания работает на повышенном уровне привилегий, но процесс графического интерфейса отсутствует. Если вы поместите тот же код в два консольных приложения, они оба будут работать на уровне пользователя и не будут иметь проблем с доступом друг к другу с общими объектами.
Попробуйте запустить приложение GUI с флагом "Запуск от имени администратора" в меню "Пуск" Windows. Если это решает проблему, вам необходимо прочитать, как запросить повышение в вашем коде. (Я этого не делал)