zoukankan      html  css  js  c++  java
  • CreateMutex

    C++
    API CreateMutex

    找出当前系统是否已经存在指定进程的实例。假设没有则创建一个相互排斥体。CreateMutex()函数可用来创建一个有名或无名的相互排斥量对象。

    HANDLE CreateMutex(   
    LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针   
    BOOL bInitialOwner, // 初始化相互排斥对象的全部者   
    LPCTSTR lpName // 指向相互排斥对象名的指针   );

    返回值   
    Long,如运行成功,就返回相互排斥体对象的句柄;零表示出错。会设置GetLastError。
    即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS

    參数表   參数 类型及说明   
    lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将參数声明为ByVal As Long,并传递零值),
    表示使用不同意继承的默认描写叙述符。

    bInitialOwner BOOL,如创建进程希望马上拥有相互排斥体,则设为TRUE。一个相互排斥体同一时候仅仅能由一个线程拥有。是FALSE,表示刚刚创建的这个Mutex不属于不论什么线程
    也就是没有不论什么线程拥有他,一个Mutex在没有不论什么线程拥有他的时候,他是处于激发态的, 所以处于有信号状态。

    lpName String,指定相互排斥体对象的名字。用vbNullString创建一个未命名的相互排斥体对象。如已经存在拥有这个名字的一个事件,
    则打开现有的已命名相互排斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符
    该名称能够有一个"Global" 或"Local" 前缀,明白地建立在全局或会话命名空间的对象。剩余的名称能够包括不论什么字符,除反斜杠字符()。
    使用终端服务(Terminal Services)会话,实现用户切换。内核对象名称必须遵循的指导方针,使应用程序能够支持多个用户终端服务。
    typedef BOOL (CALLBACK* VERIFY_VERSION_INFO)
     (
     LPOSVERSIONINFOEX lpVersionInformation, 
     DWORD dwTypeMask, 
     DWORDLONG dwlConditionMask
     );

    typedef ULONGLONG (CALLBACK* VER_SETCONDITION_MASK)(
     ULONGLONG dwlConditionMask,
     DWORD dwTypeBitMask,
     BYTE dwConditionMask
     );
    bool IsValidTerminalService()
    {
     bool result = FALSE;
     HINSTANCE hInst = LoadLibrary("Kernel32.Dll");
     if (hInst != NULL)
     {
      VERIFY_VERSION_INFO procVerifyVersionInfo = reinterpret_cast<VERIFY_VERSION_INFO>(::GetProcAddress(hInst, "VerifyVersionInfoA"));
      VER_SETCONDITION_MASK procVerSetConditionMask = reinterpret_cast<VER_SETCONDITION_MASK>(::GetProcAddress(hInst, "VerSetConditionMask"));

      if (procVerifyVersionInfo != NULL && procVerSetConditionMask != NULL)
      {
       OSVERSIONINFOEX osVersionInfo;
       DWORDLONG dwlConditionMask = 0;

       //(&osVersionInfo, sizeof(OSVERSIONINFOEX));
       osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
       osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL; // Terminal Services

       dwlConditionMask = procVerSetConditionMask(dwlConditionMask, VER_SUITENAME, VER_AND);
       result = procVerifyVersionInfo(&osVersionInfo,VER_SUITENAME,dwlConditionMask);

      }
      ::FreeLibrary(hInst);
     }

     return result;
    }

    注意:
    一旦不再须要,注意必须用CloseHandle函数将相互排斥体句柄关闭。从属于它的全部句柄都被关闭后,
    就会删除对象   进程中止前,一定要释放相互排斥体,如不慎未採取这个措施,就会将这个相互排斥体标记为废弃,并自己主动释放全部权。
    共享这个相互排斥体的其它应用程序或许仍然可以用它,但会接收到一个废弃状态信息,指出上一个全部进程未能正常关闭。这样的状况是否会造成影响取决于涉及到的详细应用程序

    使用样例:
    (1)、 h_mutex1=CreateMutex(NULL,FALSE,"mutex_for_readcount");//创建一个相互排斥体   
    (2)、HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");// 检查错误代码   
    if (GetLastError() == ERROR_ALREADY_EXISTS)   
    {   
    // 假设已有相互排斥量存在则释放句柄并复位相互排斥量   
    CloseHandle(m_hMutex);   
    m_hMutex = NULL;   // 程序退出   
    return FALSE;   
    };   //上面这段代码演示了有名相互排斥量在进程相互排斥中的使用方法。代码的核心是CreateMutex()对有名相互排斥量的创建。   
    CreateMutex() 用于有独占要求的程序 (在其进程执行期间不同意其它使用此port设备的程序执行,或不同意同名程序执行)。

  • 相关阅读:
    4 Apr 18 软件开发目录 logging模块的使用 序列化(Json, Pickle) os模块
    3 Apr 18 内置函数 列表生成式与生成器表达式 模块的使用之import 模块的使用之from…import…
    2 Apr 18 三元表达式 函数递归 匿名函数 内置函数
    30 Mar 18 迭代器 生成器 面向过程的编程
    29 Mar 18 函数 有参、无参装饰器
    28 Mar 18 函数
    27 Mar 18 函数的参数
    26 Mar 18 函数介绍
    23 Mar 18 文件处理
    22 Mar 18 补充数据类型+字符编码+文件处理
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4309057.html
Copyright © 2011-2022 走看看