首页
社区
课程
招聘
[求助]关于CreateMutex,CloseHandle的调用问题?
2021-4-26 10:55 3415

[求助]关于CreateMutex,CloseHandle的调用问题?

2021-4-26 10:55
3415

#include "stdafx.h"

 

#include <Windows.h>

 

// 判断是否重复运行
BOOL IsAlreadyRun()
{
HANDLE hMutex = NULL;
hMutex = ::CreateMutex(NULL, FALSE, "TEST");
if (hMutex)
{
if (ERROR_ALREADY_EXISTS == ::GetLastError())
{
CloseHandle(hMutex);//这行加上并没有任何变化
return TRUE;
}
}
return FALSE;
}

 

int _tmain(int argc, _TCHAR* argv[])
{
// 判断是否重复运行
if (IsAlreadyRun())
{
printf("Already Run!!!!\n");
}
else
{
printf("NOT Already Run!\n");
}

1
2
system("pause");
return 0;

}
ps:CloseHandle会减少内核对象引用计数。
第二次运行的时候,发现实例已经存在,我选择了CloseHandle(hMutex),第三次运行,第四次运行依然弹出已经有实例存在了,那这个CloseHandle到底有没有起到作用?不是把内核对象的计数已经减少到0了吗,为啥没销毁内核对象?这里求解释?


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (11)
雪    币: 6491
活跃值: (3096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
htpidk 2021-4-26 11:07
2
0
releasemutext,不是CloseHandle
雪    币: 231
活跃值: (395)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
ainideyang 2021-4-26 12:29
3
0
CloseHandle(hMutex);//这句话要放在外面的for循环里面.
雪    币: 2251
活跃值: (2148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
LexSafe 2021-4-26 12:46
4
0
代码看起来是正常的。你第三次运行时,第一个没关,他肯定提示有实例存在啊。正常来说,程序结束引用计数也会减一
雪    币: 2251
活跃值: (2148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
LexSafe 2021-4-26 12:50
5
0
你想用第二次运行的closehandle 关闭第一次创建的句柄? 那怎么可能,第二次拿到的就是无效句柄,怎么还能操作呢
雪    币: 128
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
yiruirui 1 2021-4-26 14:22
6
0
LexSafe 你想用第二次运行的closehandle 关闭第一次创建的句柄? 那怎么可能,第二次拿到的就是无效句柄,怎么还能操作呢
亲,核心编程中讲过跨进程访问内核对象句柄第三种方式:使用命名的内核对象的方式,这里CreateMutex就是用的命名的内核对象,所以即使在另一个进程中也是可以直接使用的,所以你说的第二次拿到的是无效句柄这里不对。MSDN:If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object, and the GetLastError function returns ERROR_ALREADY_EXISTS.
雪    币: 2251
活跃值: (2148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
LexSafe 2021-4-26 14:57
7
0
yiruirui 亲,核心编程中讲过跨进程访问内核对象句柄第三种方式:使用命名的内核对象的方式,这里CreateMutex就是用的命名的内核对象,所以即使在另一个进程中也是可以直接使用的,所以你说的第二次拿到的是无效句 ...
翻了翻MSDN,确实是我理解错了,第二次拿到的确实是有效句柄。但是这样问题不是很清楚了吗,第一次创建了互斥体,引用计数为1,第二次打开互斥体,引用计数为2,然后你closehandle,引用计数变为1,还是没有销毁呀
雪    币: 128
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
yiruirui 1 2021-4-26 15:00
8
0
LexSafe 翻了翻MSDN,确实是我理解错了,第二次拿到的确实是有效句柄。但是这样问题不是很清楚了吗,第一次创建了互斥体,引用计数为1,第二次打开互斥体,引用计数为2,然后你closehandle,引用计数变为1 ...
实不相瞒,我也测试过2次CloseHandle,仍然无效呀
雪    币: 2251
活跃值: (2148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
LexSafe 2021-4-26 15:02
9
0
closehandle一次以后,句柄就是不被承认的了呀
雪    币: 128
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
yiruirui 1 2021-4-26 15:05
10
0
LexSafe closehandle一次以后,句柄就是不被承认的了呀
没理解啥意思
雪    币: 2251
活跃值: (2148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
LexSafe 2021-4-26 15:07
11
0

关闭句柄以后,你就不能再对句柄进行操作了

雪    币: 2726
活跃值: (1110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ffggddss 2021-4-26 15:20
12
0
应该是先open 没有再创建,如果可以open就是已经创建了啊...
游客
登录 | 注册 方可回帖
返回