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

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

2021-4-26 10:55
4283

#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了吗,为啥没销毁内核对象?这里求解释?


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

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

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

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