2010-04-07 11 views
17

Ich habe zwei Windows-Anwendung, eine ist ein Windows-Dienst, der EventWaitHandle erstellen und darauf warten. Die zweite Anwendung ist eine Windows-GUI, die sie durch Aufruf von EventWaitHandle.OpenExisting() öffnet und versucht, das Ereignis zu setzen. Aber ich bekomme eine Ausnahme in OpenExisting. Die Ausnahme ist "Zugriff auf den Pfad wurde verweigert".Erstellen eines prozessübergreifenden EventWaitHandle

Fenster Servicecode

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

Windows-GUI-Code

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

habe ich versucht, den gleichen Code mit zwei Beispielkonsolenanwendung, es funktioniert gut.

Antwort

30

Sie müssen die Version EventWaitHandle constructor verwenden, die eine EventWaitHandleSecurity Instanz dauert. Zum Beispiel sollte der folgende Code funktioniert (es nicht getestet wird, aber hoffentlich wird beginnen Sie):

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

Auch, wenn Sie auf Vista laufen lassen oder später, müssen Sie das Ereignis im globalen Namespace erstellen (Das heißt, den Namen mit "Global \" voranstellen). Sie müssten dies auch unter Windows XP tun, wenn Sie die Funktion "Schnelle Benutzerumschaltung" verwenden.

+1

danke. lass mich zuerst testen .... – Navaneeth

+0

hey vielen dank ..... funktioniert es gut – Navaneeth

+0

ahhh ... das globale Präfix. Ich vergesse es immer. –

0

Dies kann durch den Dienstprozess verursacht werden, der auf einer erhöhten Berechtigungsstufe ausgeführt wird, der GUI-Prozess jedoch nicht. Wenn Sie denselben Code in zwei Konsolen-Apps eingeben, werden beide auf Benutzerebene ausgeführt und haben keine Probleme, auf die gemeinsam genutzten Objekte des anderen zuzugreifen.

Versuchen Sie, die GUI-App mit dem Flag "Als Administrator ausführen" im Windows-Startmenü auszuführen. Wenn das Problem dadurch behoben wird, müssen Sie nachlesen, wie Sie die Höhe in Ihrem Code anfordern können. (Ich habe das nicht getan)

+0

Ich habe mich nur als Administrator angemeldet und ich benutze Windows XP – Navaneeth

+0

Gut zu denken, aber ich glaube nicht, Run als Administrator wird helfen, da der andere Prozess in einer isolierten Sitzung ausgeführt wird. Zum Beispiel glaube ich nicht, dass Mutexes zwischen einem Dienst in "Sitzung 0" und einer angemeldeten interaktiven Sitzung geteilt werden können. Ich bin jedoch kein Experte in dieser Hinsicht. – Josh

+1

Habe gerade das folgende Dokument gefunden, das die Auswirkung der Sitzung 0 in Vista beschreibt. Wie von Codeka erwähnt, können Sie Ereignisse auf diese Weise teilen, wenn Sie explizit Global \ scope verwenden. Hier ist die URL: http://www.microsoft.com/whdc/system/sysinternals/Session0Changes.mspx – Josh