2010-04-07 24 views
17

Tôi có hai cửa sổ ứng dụng, một là một dịch vụ cửa sổ tạo EventWaitHandle và đợi cho nó. Ứng dụng thứ hai là một cửa sổ gui mở nó bằng cách gọi EventWaitHandle.OpenExisting() và cố gắng thiết lập sự kiện. Nhưng tôi nhận được một ngoại lệ trong OpenExisting. Ngoại lệ là "Truy cập vào đường dẫn bị từ chối".Tạo Sự kiện Cross-ProcessWaitHandle

cửa sổ mã dịch vụ

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

Windows GUI đang

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

tôi đã cố gắng cùng mã với hai mẫu console ứng dụng, nó đã làm việc tốt.

Trả lời

30

Bạn cần sử dụng phiên bản EventWaitHandle constructor có phiên bản EventWaitHandleSecurity. Ví dụ, đoạn mã sau nên làm việc (nó không được thử nghiệm, nhưng hy vọng sẽ giúp bạn bắt đầu):

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

Ngoài ra, nếu bạn đang chạy trên Vista hay muộn, bạn cần phải tạo ra các sự kiện trong không gian tên toàn cầu (có nghĩa là, tiền tố tên với "Global \"). Bạn cũng phải thực hiện việc này trên Windows XP nếu bạn sử dụng tính năng "Chuyển đổi người dùng nhanh".

+1

cảm ơn. Hãy để tôi kiểm tra đầu tiên .... – Navaneeth

+0

hey cảm ơn bạn rất nhiều ..... của nó làm việc tốt – Navaneeth

+0

ahhh ... tiền tố toàn cầu. Tôi luôn quên nó. –

0

Điều này có thể do quá trình dịch vụ đang chạy ở cấp đặc quyền nâng cao, nhưng quá trình GUI thì không. Nếu bạn đặt cùng một mã vào hai ứng dụng bảng điều khiển, cả hai sẽ chạy ở cấp người dùng và sẽ không gặp bất kỳ sự cố nào khi truy cập các đối tượng được chia sẻ có tên của nhau.

Thử chạy ứng dụng GUI với cờ "Chạy với tư cách quản trị viên" từ trình đơn bắt đầu của Windows. Nếu điều đó giải quyết được vấn đề, bạn cần phải đọc về cách yêu cầu độ cao trong mã của bạn. (Tôi chưa làm điều đó)

+0

tôi đăng nhập với tư cách là quản trị viên duy nhất và tôi đang sử dụng Windows XP – Navaneeth

+0

Suy nghĩ tốt, nhưng tôi không nghĩ Run as Administrator sẽ trợ giúp vì quá trình khác đang chạy trong phiên bị cô lập. Ví dụ: tôi không tin rằng Mutexes có thể được chia sẻ giữa một dịch vụ trong "phiên 0" và phiên tương tác đã đăng nhập. Tôi không có chuyên gia về vấn đề này tuy nhiên. – Josh

+1

Chỉ tìm thấy tài liệu sau mô tả tác động của phiên 0 trong Vista. Như Codeka đề cập, bạn có thể chia sẻ các sự kiện theo cách này nếu bạn sử dụng Global \ scope một cách rõ ràng. Đây là URL: http://www.microsoft.com/whdc/system/sysinternals/Session0Changes.mspx – Josh

Các vấn đề liên quan