美文网首页
C++实现程序单实例运行的两种方式

C++实现程序单实例运行的两种方式

作者: PeterZ1997 | 来源:发表于2019-02-28 19:37 被阅读0次

简介

在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫描进程列表比对进程名来检测,第二种方法是通过枚举程序窗口的方式,第三种方法是采用共享全局变量来实现,第四种方法是通过创建互斥体来实现。
那么在这些方法中,第一种和第二种方法是有缺陷的,扫描进程列表比对进程名容易对相同进程名字的不同程序产生误报,枚举窗口不适用于无窗口程序且与扫描进程列表的方法也有相同的缺陷。所以本文笔者为大家介绍第三种方法与第四种方法的具体实现。

代码实现

1. 互斥体实现方式

//////////////////////////////////////////////////////////////////
//
// FileName : SingleRunByMutex.cpp
// Creator : PeterZheng
// Date : 2019/2/16 11:21
// Comment : 互斥体实现进程单实例运行
//
//////////////////////////////////////////////////////////////////

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>

using namespace std;

// 使用互斥体保证单体运行
BOOL IsAlreadyRun()
{
    HANDLE hMutex = NULL;
    hMutex = CreateMutex(NULL, FALSE, "MYFLAG");
    if (hMutex != NULL)
    {
        if (ERROR_ALREADY_EXISTS == GetLastError())
        {
            ReleaseMutex(hMutex);
            return TRUE;
        }
    }
    return FALSE;
}

// 主函数
int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
    if (IsAlreadyRun())
    {
        MessageBox(NULL, "This Program is already RUN !", "Tips", MB_OK);
    }
    else
    {
        MessageBox(NULL, "I am RUN !", "Tips", MB_OK);
        Sleep(30000);
    }
    ExitProcess(0);
    return 0;
}

2. 共享全局变量实现方式

//////////////////////////////////////////////////////////////////
//
// FileName : SingleRunByShareSeg.cpp
// Creator : PeterZheng
// Date : 2019/2/16 11:40
// Comment : 通过共享全局变量的方式实现进程单实例运行
//
//////////////////////////////////////////////////////////////////

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>

using namespace std;

// 创建共享内存段
#pragma data_seg("sharedata")
DWORD dwFlagId = 0xEE;
#pragma data_seg()
#pragma comment(linker, "/SECTION:sharedata,RWS")

// 使用共享内存段保证单体运行
BOOL IsAlreadyRun()
{
    if (dwFlagId == 0xEF)
    {
        return TRUE;
    }
    return FALSE;
}

// 主函数
int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
    if (IsAlreadyRun())
    {
        MessageBox(NULL, "This Program is already RUN !", "Tips", MB_OK);
    }
    else
    {
        MessageBox(NULL, "I am RUN !", "Tips", MB_OK);
        dwFlagId = 0xEF;
        Sleep(30000);
    }
    ExitProcess(0);
    return 0;
}

相关文章

  • C++实现程序单实例运行的两种方式

    简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,...

  • Java 单例模式的应用

    单例模式,指的是程序在运行过程中,只产生一个实例对象。 实现单例的目的,是为了在程序运行中只产生一个实例,从而节约...

  • 单例模式,工厂模式

    单例模式 使用单例模式构建的类,在整个程序运行期间该类只存在一个实例对象。 实现方式 用 private 修饰类的...

  • VS2017的C++程序部署

    两种部署方式 VS构建的C++程序的部署,一般都是以下的两种方式: central deployment:运行vc...

  • C#开发模式——单例模式

    一、单例模式简介 单例模式是为保证一个对象,在程序运行的任何时刻只有一个实例存在,我们把这种实现方式称之为“单例模...

  • iOS主要知识总结--单例模式

    单例模式的实现 单例是一种很常见的模式,它的原理就是使程序运行过程中,某个类只有一个实例,无论以什么方式创建,都返...

  • 单例模式

    保证程序中只有一个对象实例的存在 常见的四种单例实现方式:

  • C++懒汉式单例模式遇到多线程

    C++懒汉式单例模式遇到多线程 单例模式是一个创建型设计模式, 就是保证在整个程序运行中仅存在该类的一个实例, 比...

  • 单例模式,this,super,final,接口,抽象类以及多态

    单例定义,写法 单例模式: 在程序运行其间,保存类对象只会创建一次(确保只有一个实例) 实现步骤: 私有化构造方法...

  • Mac上只运行一个程序实例的一种实现(锁文件)

    前言 在开发应用程序的时候,我们难免要实现确保用户的PC上只能运行程序的一个实例,实现的方式肯定不止一种,这里我就...

网友评论

      本文标题:C++实现程序单实例运行的两种方式

      本文链接:https://www.haomeiwen.com/subject/rjwkuqtx.html