能力值:
( LV2,RANK:10 )
2 楼
CloseHandle
能力值:
( LV2,RANK:10 )
3 楼
就是不行不能关闭,依然可以打开
能力值:
( 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,也就是事件已经被销毁了
能力值:
( LV2,RANK:10 )
5 楼
好像还是可以打开
asd:=OpenEvent(EVENT_ALL_ACCESS, FALSE, 'Global\test');
CloseHandle(asd);
还是不能关闭,另外一个进依然可以打开这个句柄,只是在进程退出后 getlasterror 为 87,
能力值:
( 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也就不会返回。
上传的附件:
能力值:
( LV2,RANK:10 )
7 楼
你用2个进程试试呢?我这里就是2个进程,一个创建和关闭,一个打开!然后关闭后依然可以打开,关闭后还是能OPen,创建事件的进程退出后就是87
上传的附件:
能力值:
( 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.
能力值:
( LV2,RANK:10 )
9 楼
感谢,那这样的话这个事件要怎么在进程2里面去处理呢?怎么去销毁呢?不然事件句柄万一创建多了也不好吧!
或者 进程2 有没有更好的办法去打开 进程1 里面的事件句柄!内存共享事件句柄的话我测试好像无效
能力值:
( LV2,RANK:10 )
10 楼
接上面,假设程序1退出了,程序2持有事件句柄,那么调用CloseHandle,事件就会被销毁。
能力值:
( LV2,RANK:10 )
11 楼
好像不行,还是不能关闭!事件还是存在!
上传的附件:
能力值:
( LV2,RANK:10 )
12 楼
首先没看见你哪里关闭了事件……
然后87是参数错误……你确定判断GetLastError=87有意义?
能力值:
( LV2,RANK:10 )
13 楼
拦截 explorer 进程创建 ,是进程2 就是上面的图
进程1 的代码
87 【87】-参数错误。是在进程1 退出后出现的 也是调用 OPenevent之后
上传的附件:
能力值:
( LV2,RANK:10 )
14 楼
……这个和引用计数类似,我就以此举例吧。。
CreateEvent后,计数为1
每一次OpenEvent,计数+1
每一次CloseEvent,计数-1
当计数为0的时候事件销毁
所以你的代码有些问题呢……
如果我没记错的话是这样
能力值:
( LV2,RANK:10 )
15 楼
我触发了很多次CloseHandle还是关闭不了啊!求解啊
能力值:
( LV2,RANK:10 )
16 楼
求教大婶们啊!~
能力值:
( LV2,RANK:10 )
17 楼
你在一个进程里多次CloseHandle是无法关掉另一个程序的event的……
DLL中:
HANDLE hEvent;
DLLMAIN:
DLL_PROCESS_ATTACH:
hEvent = OpenEvent(...);
然后DLL中不要再OpenEvent了
当WaitForMultipleObjectsEx返回进程结束的时候,CloseHandle(hEvent);
这样事件就关闭了……
我看到你hevent=openevent(...);closeevent(hevent);这是毫无效果的。。。
能力值:
( LV2,RANK:10 )
18 楼
因为是进程通信,explorer -> ZwCreateProcessEx 中 WaitForMultipleObjects 前要 肯定要检查事件是否存在就必须 要多次 OPenEvent ,然后等待 进程1 setevent 返回!像这种事件和内存共享的方式,还有个多个进程通信同步的问题!
能力值:
( LV2,RANK:10 )
19 楼
进程间同步的东西,只要涉及同步,必须要在 共享的进程里把引用的资源清理干净,才可以,在主线程退出,
其实如果你能拿到自己进程TableObject的话,把SYNCHRONIZE 状态置为空也可以。对了,如果直接置空,可能会导置三精
能力值:
( LV2,RANK:10 )
20 楼
错误代码还研究?
关闭后,hevent = null;
谢谢。 这是核心编程书说的。
能力值:
( LV2,RANK:10 )
21 楼
跟waitforsingleobject有什么关系?
能力值:
( LV2,RANK:10 )
22 楼
dll中打开后,dll中关闭就行了
哪里打开,哪里关闭,
搞了这么复杂