Создание кросс-процесса EventWaitHandle - PullRequest
18 голосов
/ 07 апреля 2010

У меня есть два приложения Windows, одно из них - служба Windows, которая создает EventWaitHandle и ждет его.Второе приложение - это графический интерфейс Windows, который открывает его, вызывая EventWaitHandle.OpenExisting () и пытается установить событие.Но я получаю исключение в OpenExisting.Исключением является «Доступ к пути запрещен».

windows Сервисный код

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);
}

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

Ответы [ 2 ]

32 голосов
/ 07 апреля 2010

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

0 голосов
/ 07 апреля 2010

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

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

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