首页
社区
课程
招聘
[求助]创建全局事件无法关闭
发表于: 2014-8-22 15:06 6953

[求助]创建全局事件无法关闭

2014-8-22 15:06
6953
CreateEvent( nil, FALSE, FALSE, 'Global\test' );

随便怎么关闭都不能关闭呢?OpenEvent(EVENT_ALL_ACCESS, FALSE, 'Global\test');

依然可以打开!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 1042
活跃值: (495)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
CloseHandle
2014-8-22 15:29
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
就是不行不能关闭,依然可以打开
2014-8-22 15:30
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
HANDLE hevent = CreateEvent(nullptr, FALSE, FALSE, L"Global\\test");
CloseHandle(hevent);
hevent = OpenEvent(EVENT_ALL_ACCESS, FALSE, L"Global\\test");
if (hevent != nullptr)
{
	MessageBox(0, 0, 0, 0);
}


随手写的,反正对话框没弹出来,说明OpenEvent返回null,也就是事件已经被销毁了
2014-8-22 16:27
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好像还是可以打开
asd:=OpenEvent(EVENT_ALL_ACCESS, FALSE, 'Global\test');
CloseHandle(asd);

还是不能关闭,另外一个进依然可以打开这个句柄,只是在进程退出后 getlasterror 为 87,
2014-8-22 16:39
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
HANDLE hEvent = CreateEvent(nullptr, FALSE, FALSE, L"Global\\test");
printf("Event: %x\n", hEvent);
printf("call CloseHandle\n");
CloseHandle(hEvent);
printf("call OpenEvent\n");
hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, L"Global\\test");
printf("Event: %x, GetLastError: %d\n", hEvent, GetLastError());
system("pause");




我猜测你还是在对进程通信问题耿耿于怀……
我说下自己的理解
你的主进程创建了一个EVENT,另一个程序中打开了这个EVENT,主进程结束之后,由于另一个程序任然“持有”这个EVENT,所以此EVENT不会被销毁,WaitForSingleObject也就不会返回。
上传的附件:
2014-8-22 16:53
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你用2个进程试试呢?我这里就是2个进程,一个创建和关闭,一个打开!然后关闭后依然可以打开,关闭后还是能OPen,创建事件的进程退出后就是87
上传的附件:
2014-8-22 16:56
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这么说吧
进程1 CreateEvent,CloseHandle,之后进程2OpenEvnet会失败
如果进程1 CreateEvent,进程2 OpenEvent,进程1 CloseHandle,事件任然存在,不会被销毁
参见MSDN说明:
The system closes the handle automatically when the process terminates. The event object is destroyed when its last handle has been closed.
2014-8-22 17:02
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢,那这样的话这个事件要怎么在进程2里面去处理呢?怎么去销毁呢?不然事件句柄万一创建多了也不好吧!

或者 进程2 有没有更好的办法去打开 进程1 里面的事件句柄!内存共享事件句柄的话我测试好像无效
2014-8-22 17:10
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
接上面,假设程序1退出了,程序2持有事件句柄,那么调用CloseHandle,事件就会被销毁。
2014-8-22 17:16
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好像不行,还是不能关闭!事件还是存在!
上传的附件:
2014-8-22 17:24
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
首先没看见你哪里关闭了事件……
然后87是参数错误……你确定判断GetLastError=87有意义?
2014-8-22 17:34
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
拦截 explorer  进程创建 ,是进程2 就是上面的图

进程1 的代码

87 【87】-参数错误。是在进程1 退出后出现的 也是调用 OPenevent之后
上传的附件:
2014-8-22 17:43
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
……这个和引用计数类似,我就以此举例吧。。
CreateEvent后,计数为1
每一次OpenEvent,计数+1
每一次CloseEvent,计数-1
当计数为0的时候事件销毁
所以你的代码有些问题呢……

如果我没记错的话是这样
2014-8-22 17:52
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我触发了很多次CloseHandle还是关闭不了啊!求解啊
2014-8-22 17:57
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
求教大婶们啊!~
2014-8-22 18:33
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你在一个进程里多次CloseHandle是无法关掉另一个程序的event的……

DLL中:
HANDLE hEvent;

DLLMAIN:
DLL_PROCESS_ATTACH:
hEvent = OpenEvent(...);

然后DLL中不要再OpenEvent了
当WaitForMultipleObjectsEx返回进程结束的时候,CloseHandle(hEvent);

这样事件就关闭了……

我看到你hevent=openevent(...);closeevent(hevent);这是毫无效果的。。。
2014-8-22 20:19
0
雪    币: 142
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
因为是进程通信,explorer -> ZwCreateProcessEx 中 WaitForMultipleObjects 前要 肯定要检查事件是否存在就必须 要多次 OPenEvent ,然后等待 进程1  setevent 返回!像这种事件和内存共享的方式,还有个多个进程通信同步的问题!
2014-8-23 02:12
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
进程间同步的东西,只要涉及同步,必须要在 共享的进程里把引用的资源清理干净,才可以,在主线程退出,
其实如果你能拿到自己进程TableObject的话,把SYNCHRONIZE 状态置为空也可以。对了,如果直接置空,可能会导置三精
2014-8-23 05:49
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
错误代码还研究?

关闭后,hevent = null;

谢谢。 这是核心编程书说的。
2014-8-23 20:17
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
跟waitforsingleobject有什么关系?
2014-8-23 20:28
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
dll中打开后,dll中关闭就行了

哪里打开,哪里关闭,

搞了这么复杂
2014-8-23 20:31
0
游客
登录 | 注册 方可回帖
返回
//