Création d’un événement multi-processus EventWaitHandle

J’ai deux applications Windows, l’une est un service Windows qui crée EventWaitHandle et l’attend. La deuxième application est un interface graphique Windows qui l’ouvre en appelant EventWaitHandle.OpenExisting () et en essayant de définir l’événement. Mais je reçois une exception dans OpenExisting. L’exception est “L’access au chemin est refusé”.

code de service windows

EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName"); wh.WaitOne(); 

Code d’interface graphique Windows

 try { EventWaitHandle wh = EventWaitHandle.OpenExisting("MyEventName"); wh.Set(); } catch (Exception ex) { MessageBox.Show(ex.Message); } 

J’ai essayé le même code avec deux exemples d’application de console, cela fonctionnait bien.

Vous devez utiliser la version du constructeur EventWaitHandle qui prend une instance EventWaitHandleSecurity . Par exemple, le code suivant devrait fonctionner (il n’est pas testé, mais espérons-le, il vous aidera à démarrer):

 // 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); ... 

De plus, si vous utilisez Vista ou une version ultérieure, vous devez créer l’événement dans l’espace de noms global (c’est-à-dire, préfixez le nom avec “Global \”). Vous devrez également le faire sous Windows XP si vous utilisez la fonction “Changement rapide d’utilisateur”.

Cela peut être dû au processus de service qui s’exécute à un niveau de privilège élevé, mais pas au processus de l’interface graphique. Si vous mettez le même code dans deux applications de console, elles s’exécuteront toutes deux au niveau utilisateur et n’auront aucun problème à accéder aux objects partagés nommés de l’autre.

Essayez d’exécuter l’application graphique avec l’indicateur “Exécuter en tant qu’administrateur” dans le menu Démarrer de Windows. Si cela résout le problème, vous devez savoir comment demander une élévation dans votre code. (Je n’ai pas fait ça)