2010-04-07 17 views
17

Ho due applicazioni per Windows, una è un servizio Windows che crea EventWaitHandle e lo aspetto. La seconda applicazione è una GUI di Windows che la apre chiamando EventWaitHandle.OpenExisting() e prova a impostare l'evento. Ma sto ottenendo un'eccezione in OpenExisting. L'eccezione è "Accesso al percorso negato".Creazione di un evento cross-process EventWaitHandle

finestre di codice Servizio

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

codice GUI di Windows

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

ho provato lo stesso codice con due applicazioni console di esempio, stava funzionando benissimo.

risposta

30

È necessario utilizzare la versione dello EventWaitHandle constructor che accetta un'istanza EventWaitHandleSecurity. Ad esempio, il seguente codice dovrebbe funzionare (non è testato, ma si spera che vi permetterà di cominciare):

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

Inoltre, se si sta eseguendo su Vista o versioni successive, è necessario creare l'evento nel namespace globale (cioè, prefisso il nome con "Global \"). Dovresti farlo anche su Windows XP se usi la funzione "Cambio rapido utente".

+1

. fammi testare prima .... – Navaneeth

+0

hey grazie mille ..... la sua multa di lavoro – Navaneeth

+0

ahhh ... il prefisso globale. Lo dimentico sempre. –

0

Questo potrebbe essere causato dal processo di servizio in esecuzione a un livello di privilegio elevato, ma il processo della GUI non lo è. Se si inserisce lo stesso codice in due app console, entrambe verranno eseguite a livello di utente e non avranno problemi ad accedere ai rispettivi oggetti condivisi denominati.

Provare a eseguire l'app GUI con il flag "Esegui come amministratore" dal menu Start di Windows. Se questo risolve il problema, devi leggere come richiedere l'elevazione all'interno del tuo codice. (Non l'ho fatto)

+0

Ho effettuato l'accesso solo come amministratore e sto utilizzando Windows XP – Navaneeth

+0

Buona idea, ma non penso che Esegui come amministratore sarà d'aiuto poiché l'altro processo è in esecuzione in una sessione isolata. Ad esempio, non credo che i Mutex possano essere condivisi tra un servizio in "sessione 0" e una sessione interattiva connessa. Non sono esperto in questo senso, tuttavia. – Josh

+1

Trova il seguente documento che descrive l'impatto della sessione 0 in Vista. Come menziona Codeka, puoi condividere gli eventi in questo modo se usi esplicitamente il Global \ scope. Ecco l'URL: http://www.microsoft.com/whdc/system/sysinternals/Session0Changes.mspx – Josh