Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181969
  • 博文数量: 88
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 914
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-10 13:41
文章分类

全部博文(88)

文章存档

2010年(2)

2009年(35)

2008年(51)

我的朋友

分类: WINDOWS

2008-04-18 00:18:51

HANDLE CreateMutex(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  BOOL bInitialOwner,
  LPCTSTR lpName
);

其中参数lpMutexAttributes用来设定Mutex对象的安全描述符和是否允许子进程继承句柄。bInitialOwner表 明是否将Mutex的持有者设置为调用线程。lpName参数设置Mutex的名字,该名字区分大小写并不能包含"\",最大长度为MAX_PATH,可 设置为NULL表明该Mutex为匿名对象。
如果调用成功,则返回Mutex的句柄,否则返回NULL,如果lpName不为NULL且调用前同 名的Mutex已被创建,则返回同名Mutex的句柄,此时调用GetLastError将返回ERROR_ALREADY_EXISTS,参数 bInitialOwner将被忽略。

还可以调用OpenMutex打开创建的非匿名Mutex,原型如下

HANDLE OpenMutex(
  DWORD dwDesiredAccess,
  BOOL bInheritHandle,
  LPCTSTR lpName
);

在成功创建或打开Mutex后,可以使用wait functions来等待并获取Mutex的持有权。

下面的例子用来通过Mutex对象控制某一应用程序只运行一次

    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        HANDLE hMutex = CreateMutex(NULL, FALSE, "Mutex_Only_One_Instance_Allowed");
        if (NULL == hMutex)
        {
            Error("Create mutex error.");
            return -1;
        }
        DWORD dw = WaitForSingleObject(hMutex, 0);
        if (WAIT_FAILED == dw)
        {
            Error("Wait for mutex error.");
            CloseHandle(hMutex); // 释放句柄,当指向同一系统对象的所有句柄释放后,该对象将被删除。
            return -1;
        }
        else if (WAIT_TIMEOUT == dw)
        {
            // 另外一个实例正在运行
            CloseHandle(hMutex);
            return 1;
        }

        // 没有其它实例在运行,本实例将继续运行
        // 在此实现必要的功能性代码,如创建窗口,进入消息循环
        // ...............

        ReleaseMutex(hMutex); // 释放hMutex的持有权,注意这并不等同于删除Mutex对象
        CloseHandle(hMutex);

        return 0;
}
阅读(746) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~