软件运行唯一性

软件运行唯一性,我这里的意思同一个app,同一时间,只能有一个实例化运行。

为了使一个应用程序在同一时间只运行一个实例,需要用某种方法在程序启动时,检测是否已有正在运行的实例,如果有则直接退出,如果没有,则正常启动。

1、共享内存实现:
使用qt代码做示范,main函数中添加如下代码:

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);

    QSharedMemory shared_memory("openOne_thisApp");		
    if(shared_memory.attach())
    {
    
    
        QMessageBox::showWarning(nullptr, QObject::tr("请勿重复打开App"), QMessageBox::Ok);
        return 0;		//共享内存段已被绑定,说明已经有app打开
    }
    if(!shared_memory.create(1))	
        return 0;		//共享内存创建失败
        
    ...           // 以下是正常启动代码
}

2、互斥量实现
使用Windows的API创建一个互斥量标记软件运行,代码如下

#include <windows.h>

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);

    HANDLE hMutex = CreateMutex(NULL, TRUE, L"YourApp");     // 创建一个互斥量来保证只运行一个实例
    if(hMutex != NULL)
    {
    
    
        if(GetLastError() == ERROR_ALREADY_EXISTS)
        {
    
    
        	QMessageBox::showWarning(nullptr, QObject::tr("请勿重复打开App"), QMessageBox::Ok);
            return 1;
        }
    }
    
    ...           // 以下是正常启动代码
}

3、进程查询方式
参考文章:windows下使用qt查询进程是否存在
思路很简单,就是查询到此进程存在就退出。
但是有个问题就是,你本身就是这个进程,所以需要判断是否有两个这样的进程。或者在第三方app中启动该进程,我们称这个第三方app为守护进程。
守护进程实现方式:https://blog.csdn.net/weixin_42887343/article/details/111781260

4、文件锁方式
待后续更新实现。

猜你喜欢

转载自blog.csdn.net/weixin_42887343/article/details/121201982