CreateMutex创建互斥内核对象

本文介绍如何通过CreateMutex函数创建互斥内核对象,实现程序仅运行一个实例的目标。详细解释了CreateMutex的参数及其意义,并展示了如何通过修改第三个参数来控制是否允许程序多次打开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.sina.com.cn/s/blog_149e9d2ec0102wyr0.html

在编程中我们常使用程序创建一个互斥的内核对象,目的就是为了让这个程序只能运行一次。我们都会有这样一个经历,那就是如果我们的打开一个游戏或者其他应用程序,会发现如果想在打开这个游戏,会出现打不开的情况,那是因为使用的是互斥的方式打开。当然我们在编写程序时也是可以写成进程间共享,就想QQ一样可以同时打开多个应用程序。

1.  我们需要一个关键的函数:CreateMutex().
这个函数的具体信息大家可以自己百度或查找MSDN。此处我仅仅讲解它的使用。
这个函数有三个参数,特别是第三个参数控制时候可以内存共享。如果你写一个名字比如:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //表示创建一个名为stf的互斥内核对象,那么这个程序仅仅在同一台计算机上被允许打开一次。如果再次打开就会出现错误。
HANDLE hNutex = CreateMutex(NULL, FALSE, NULL); //表示创建匿名互斥内核对象,那么这个程序就会被允许多次打开。


我们查看一下相关代码:
#include
#include


int _tmain()
{
    HANDLE hNutex = CreateMutex(NULL, FALSE, NULL);//创建一个名字叫NULL的互斥内核对象
    //匿名内核对象,就是没有名字的内核对象,这种内核对象,不能在进程间共享
    //命名内核对象可以在进程间共享
    if (ERROR_ALREADY_EXISTS == GetLastError())
    {
        _tprintf(L"%s\n", L"This is the next instance! and session id is ");
        return 0;
    }


    DWORD sessionid = 0;
    ProcessIdToSessionId(GetProcessId(NULL), &sessionid);
    _tprintf(L"%s\n", L"This is the first instance! and session id is ");


    _gettchar();
    return 0;
}


HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //创建命名内核对象。
大家可以通过CreateMutex的第三个参数的修改来确定是哪一个值。


2.  创建本地命名对象和全局命名对象
其实这个还是很简单的如果要创建本地内核对象,只需要在命名对象名字前面加一个Local就行了。如果需要创建全局对象,那么只需要在命名对象前面加一个Global就可。分别如下:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Local\\stf");  //创建本地内核对象
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Global\\stf");  //创建全局内核对象


但是需要注意的是Session不要轻易使用。即HANDLE hNutex = CreateMutex(NULL, FALSE, L"Session\\stf");少用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值