CreateMutex作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针
BOOLbInitialOwner, // 初始化互斥对象的所有者
LPCTSTRlpName // 指向互斥对象名的指针
);

创建一个互斥体(MUTEX)
返回值
Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。如果返回的是一个有效句柄,但指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS,bInitialOwner的值将会被忽略。如果调用者限制了权限,GetLastError将会返回ERROR_ACCESS_DENIED,这个时候应该使用OpenMutex函数。
参数表
参数 类型及说明
lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符
bInitialOwner BOOL,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有
lpName String,指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符

一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象
线程中止前,一定要调用ReleaseMutex释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃(下一个释放的等待函数会返回WAIT_ABANDONED),并自动释放所有权。共享这个互斥体的其他应用程序也许仍然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序。
在Windows系统中,线程可以在等待函数中指定一个此线程已经拥有的互斥体,由于Windows的防死锁机制,这种做法不会阻止此线程的运行。
使用例子编辑
常用操作mutex的函数还有:ReleaseMutex/OpenMutex/WaitForSingleObject/WaitForMultipleObjects。
创建互斥体
h_mutex1=CreateMutex(NULL,FALSE,"mutex_for_readcount");//创建一个互斥体
检查错误代码
#include <stdio.h>
  #include <windows.h>
  ...... // main function
  HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");// 检查错误代码
if (GetLastError() == ERROR_ALREADY_EXISTS)
  {
  // 如果已有互斥量存在则释放句柄并复位互斥量 
  CloseHandle(m_hMutex);
  m_hMutex = NULL;
  // 程序退出
  return FALSE;
  };
//上面这段代码演示了有名互斥量在进程互斥中的用法。代码的核心是CreateMutex()对有名互斥量的创建。
CreateMutex() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。
详细例子
下面这段代码详细介绍了CreateMutex函数的使用方法:[1] 
#include "stdafx.h"
#include "windows.h"
 
int main(int argc, char* argv[])
{
    HANDLE m_hMutex = CreateMutex(NULL,TRUE,"cplusplus_me");
    DWORD dwRet = GetLastError();
    if (m_hMutex)
    {
        if (ERROR_ALREADY_EXISTS == dwRet)
        {
            printf("程序已经在运行中了,程序退出!\n");
            CloseHandle(m_hMutex);
            return 0;
        }
    }
    else
    {
        printf("创建互斥量错误,程序退出!\n");
        CloseHandle(m_hMutex);
        return 0;
    }
    while(1)
    {
        printf("cplusplus_me\n");
    }
    CloseHandle(m_hMutex);
    return 0;
}

CreateMutex的使用相关推荐

  1. CreateMutex创建互斥体可以用于只运行进程的一个实例

    CreateMutex 作用 找出当前系统是否已经存在指定进程的实例.如果没有则创建一个互斥体.CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为 VC声明 HANDLE ...

  2. 关于程序多开的尝试。CreateMutex,OpenMuxtex,ReleaseMutex

    因为偶尔会遇到对那些不能支持双开的程序进行多开.. 根据前一阵转的一篇文件了解到,现在大多程序都用CreateMutex方式来限制多开, 于是有个想法:它Create了,我Release它,然后不就可 ...

  3. 防止程序启动两次的方法CreateMutex()

    在工程文件中, WinMain函数里加上以下代码(此代码在BCB6.0下运行):          HANDLE hMutex = CreateMutex(NULL, false, "Pro ...

  4. C++使用Windows API CreateMutex函数多线程编程

    C++中也可以使用Windows 系统中对应的API函数进行多线程编程.使用CreateThread函数创建线程,并且可以通过CreateMutex创建一个互斥量实现线程间数据的同步: #includ ...

  5. Delphi CreateMutex 防止程序多次运行

    windows是个多用户多任务的操作系统,支持多个程序同时运行,如果你的程序不想让用户同时运行一个以上, 那应该怎样做呢? 本文将介绍避免用户同时运行多个程序的例子. 需要用到的函数CreateMut ...

  6. hook createmutex openmutex 实现多开

    通过HOOK createmutex 来多开程序,比如微信. FARPROC addrOpenMutexW = NULL; FARPROC addrCreateMutexW = NULL;void h ...

  7. CreateMutex、WaitForSingleObject、ReleaseMutex——创建互斥对象

    CreateMutex CreateMutex作用是找出当前系统是否已经存在指定进程的实例.如果没有则创建一个互斥体. 互斥对象是系统内核维护的一种数据结构,它保证了对象对单个线程的访问权 互斥对象的 ...

  8. CreateEvent、CreateSemaphore、ReleaseSemaphore、CreateMutex

    /// 用户模式 对事件进行初始化操作 HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性BOOL bManualR ...

  9. c++使用CreateMuteX函数创建互斥对象单一运行实例

    c++使用CreateMuteX函数创建互斥对象单一运行实例 #include "stdafx.h" #include <Windows.h>// 判断是否重复运行 B ...

最新文章

  1. 三、Spring Boot在org.springframework.boot组下应用程序启动器
  2. linux下面获取当前bing-国内版的壁纸
  3. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统
  4. 二进制搜索树_数据结构101:二进制搜索树
  5. 第二百六十三天 how can I 坚持
  6. C++安全方向opensssl(三)3.1 什么是单项散列函数
  7. 《你有多少问题要请示》精华集粹
  8. 企业数字化转型:构建“感知—思考—响应—反馈优化”闭环
  9. 十款微信小程序源码分享
  10. SQL 常用英文单词
  11. 学校运动会广播稿计算机,学校运动会广播稿十篇
  12. 强化学习导论_Example 6.5: Windy Grid-world
  13. python玩转我的世界_PYTHON玩转我的世界——批量生成铁傀儡
  14. 页面自动获取导入excel内容
  15. ps大图缩小让小图更清晰
  16. 2020.9.23 金山云后台开发岗笔试 2道编程
  17. linux设置开机自启服务,linux设置服务开机自启动的三种方式
  18. ONVIF工具使用说明
  19. C语言--师生信息管理系统(第一次小项目)
  20. Base64 SHA1 MD5

热门文章

  1. Jenkins-Test
  2. 计算机网络考前复习知识点(基础)
  3. VLOOKUP 函数出现 #N/A 错误的 4 种情况(附解决方法)
  4. 五险一金 | 每月缴纳的社保费用都去哪了?(好漂亮的小姐姐)
  5. 校园食堂明厨亮灶智能视频监控 YOLOv5
  6. python发送带表格的邮件_PYTHON自动发送报表邮件
  7. Unity中使用Glow 11边缘发光插件
  8. python3 中文乱码 UnicodeEncodeError: ‘latin-1‘ codec can‘t encode characters
  9. 8m照片宽和高是多少_世界上最大的相册:每页宽达8米(能容纳一万张照片)
  10. 5个月两次坠机,波音737-8有啥硬伤?没那么简单