请教:CreateEvent调用失败的原因

nipcdll 2006-11-08 10:41:28
hEvent = CreateEvent(NULL, false, false, "MyEvent");
GetLastError()得到的结果总是5( Access is denied. ERROR_ACCESS_DENIED )
想了半天不知道是什么原因?
谢谢
...全文
835 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunboyljp 2006-12-07
  • 打赏
  • 举报
回复
Jeffrey Richter《Programming Applications for Microsoft Windows》
Jim_King_2000 2006-11-08
  • 打赏
  • 举报
回复
If lpName matches the name of an existing semaphore, mutex, waitable timer, job, or file-mapping object, the function fails and the GetLastError function returns ERROR_INVALID_HANDLE. This occurs because these objects share the same name space.
(from MSDN)

如果不需要在进程间共享event,大可以创建匿名的event(两个进程都要匿名哦)。按照MSDN的说法,如果全局名字冲突的话,应该得到ERROR_INVALID_HANDLE错误,而不是ERROR_ACCESS_DENIED。如果需要创建进程共享的event,就需要使用名称,但最好是类似于GUID一样的字符串,以免太简单而容易导致冲突。你可以写两个进程的最简单的例子,除了创建event之外,什么都不做。看看这样是不是仍然有问题。ERROR_ACCESS_DENIED确实是一个很奇怪的错误,我也不是很清楚它产生的原因。
nipcdll 2006-11-08
  • 打赏
  • 举报
回复
这是一个进程里面的代码,等待Event的:
HANDLE hEvent;
HANDLE hFileMap;
LPBYTE pcMap;

hEvent = CreateEvent(NULL, false, false, "MyEvent");
// hEvent = CreateEvent(NULL, false, false, NULL);
if(hEvent == NULL)
{
LogStrToFile("CreateEvent error!\n");
return -3;
}

hFileMap = CreateFileMapping((HANDLE)0xffffffff,NULL, PAGE_READWRITE, 0, 4 * 1024, "MyShareData");
if(hFileMap == NULL)
{
LogStrToFile("CreateFileMapping error!\n");
return -4;
}

pcMap = (LPBYTE)MapViewOfFile(hFileMap,FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0);
if(pcMap == NULL)
{
// printf("MapViewOfFile failed\n");
LogStrToFile("MapViewOfFile error!\n");
CloseHandle(hFileMap);
return -5;
}

while (true)
{
LogStrToFile("while...!\n");

// block here and wait for wake up
WaitForSingleObject(hEvent, INFINITE);

LogStrToFile("WaitForSingleObject ok!\n");
LogStrToFile((char*)pcMap);
LogStrToFile("\n");

if(strcmp((char*)pcMap,"restart") == 0)
{
LogStrToFile("ReStart Req !\n");

}
}

LogStrToFile("start OK!\n");

UnmapViewOfFile(pcMap);
CloseHandle(hFileMap);
CloseHandle(hEvent);

这是另外一个进程中的代码:
HANDLE hFileMap;
HANDLE hEvent;
LPBYTE pcMap;

hEvent= CreateEvent(NULL, false, false, "MyEvent");
// hEvent= CreateEvent(NULL, false, false, NULL);
if(hEvent == NULL)
{
//printf("createEvent failed\n");
DWORD err = GetLastError();
return 0;
}

hFileMap = CreateFileMapping((HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, 4 * 1024, "MyShareData");
if(hFileMap == NULL)
{
//printf("createfilemapping failed\n");
DWORD err = GetLastError();
return 0;
}

pcMap = (LPBYTE)MapViewOfFile(hFileMap, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0);
if(pcMap == NULL)
{
//printf("MapViewOfFile failed\n");
DWORD err = GetLastError();

CloseHandle(hFileMap);
return 0;
}

//printf("begin write\n");

strcpy((char*)pcMap,"restart");
WriteLogStr((char*)pcMap);

UnmapViewOfFile(pcMap);
CloseHandle(hFileMap);

SetEvent(hEvent);
CloseHandle(hEvent);
Jim_King_2000 2006-11-08
  • 打赏
  • 举报
回复
多贴一点代码吧,信息太少了。
nipcdll 2006-11-08
  • 打赏
  • 举报
回复
你是说这样?hEvent = CreateEvent(NULL, false, false, NULL);
你的意思是说可能已经存在一个MyEvent了?
我在前面加了判断:hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MyEvent");
还有出现那个错误
Jim_King_2000 2006-11-08
  • 打赏
  • 举报
回复
换匿名的event试试看?
Jim_King_2000 2006-11-08
  • 打赏
  • 举报
回复
推荐
Jeffrey Richter《Programming Applications for Microsoft Windows》
nipcdll 2006-11-08
  • 打赏
  • 举报
回复
好的,非常感谢你的帮助
我再试试

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧