前段時間我寫了一個小的 Win32 測驗應用程式,它除了創建一個用于在兩個行程之間同步的事件之外什么也沒做。CreateEvent回來后,即使以管理員身份運行,行程也會回傳錯誤 5(訪問被拒絕),這讓我感到震驚。
ghWriteEvent = CreateEvent(
NULL, // default security attributes
FALSE, // auto-reset event
FALSE, // initial state is nonsignaled
TEXT("Global\\WriteEvent") // object name
);
if (ghWriteEvent == NULL)
{
printf("CreateEvent failed (%d)\n", GetLastError());
return 1;
}
經過一些除錯后,我決定更改事件的名稱,突然它起作用了。一次偶然的機會,我決定查看 WinObj 中的事件創建/洗掉,我看到了它失敗的原因:已經有一個名為WriteEventunder的事件\BaseNamedObjects。
我可以做些什么來使命名事件在重新啟動時持續存在,更重要的是,我怎樣才能擺脫它?
編輯:在我的應用程式有機會這樣做之前,似乎在全域命名空間中創建了一些其他應用程式。WriteEvent(現在)明顯的解決方法是使用一些唯一的名稱或使用 GUID 或其他任何東西來避免名稱沖突。
uj5u.com熱心網友回復:
當CreateEventW帶有錯誤代碼的命名物件失敗時,ERROR_ACCESS_DENIED這通常意味著其他人已經創建了具有該名稱的事件。在這種情況下,系統會嘗試使用 來打開事件物件EVENT_ALL_ACCESS。當此訪問模式與呼叫執行緒的 ACL 不兼容時,API 呼叫將失敗并顯示ERROR_ACCESS_DENIED.
要解決此問題,您需要為事件物件提供一個唯一名稱。一種常見的方法是使用 GUID 的字串表示形式作為名稱。您可以在 Visual Studio 開發人員命令提示符下使用guidgen.exe工具生成 GUID 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460360.html
