Создание межпроцессного EventWaitHandle

У меня есть два приложения 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);
}

Я попробовал тот же код двумя демонстрационными консольными приложениями, он хорошо работал.

19
задан John Saunders 7 April 2010 в 06:26
поделиться

2 ответа

Вам необходимо использовать версию конструктора 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, если вы используете функцию «Быстрое переключение пользователей».

33
ответ дан 30 November 2019 в 03:52
поделиться

Это может быть вызвано тем, что процесс службы работает с повышенным уровнем привилегий, а процесс графического интерфейса - нет. Если вы поместите один и тот же код в два консольных приложения, они оба будут работать на уровне пользователя, и у них не будет проблем с доступом к именованным общим объектам друг друга.

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

0
ответ дан 30 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: