当前位置: 首页 > news >正文

C++ 运行单个实例,防止程序多次启动

 

利用内核对象 封装的类,使用运行单个实例,防止多次启动Demo

例子下载地址:http://pan.baidu.com/share/link?shareid=3202369154&uk=3037189616

 

光影道和

 

//File Name: Singleton.h
#pragma once

class Singleton
{
private:
    CString strGUID;
    CString strMapFileGUID;

    HANDLE m_hSingleton;

public:
    Singleton();
    ~Singleton();
public:
    void AppStart (const HWND & hWnd) const;
};

 

 

//File Name: Singleton.cpp

#include "stdafx.h"
#include "Singleton.h"

Singleton::Singleton()
{
    strGUID = _T("{D727BDB5-F86A-405b-910D-11AD2A4CA76E}");
    strMapFileGUID = strGUID + _T("_MapFile");
    m_hSingleton = NULL;
}

Singleton::~Singleton()
{
    if (m_hSingleton)
    {
        CloseHandle(m_hSingleton);
        m_hSingleton = NULL;
    }
}

void Singleton::AppStart(const HWND & hWnd) const
{
    HANDLE m_hSingleton = NULL;
    m_hSingleton = CreateMutex(NULL, TRUE, strGUID);
    RECT rect;

    ZeroMemory(&rect, sizeof(rect));
    ::GetWindowRect(hWnd, &rect);

    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        // 打开共享文件
        HANDLE hHandle = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, strMapFileGUID);
        if (hHandle)
        {
            LPTSTR lpMapAddr = (LPTSTR)::MapViewOfFile(hHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
            CString strBuffer(lpMapAddr);
            
            HWND hOldWnd = (HWND)_tcstoul(strBuffer, NULL, 10);
            ::SetForegroundWindow(hOldWnd);

            // 取消内核对象的映射
            UnmapViewOfFile(hHandle);

            CloseHandle(hHandle);

            exit(0);
        }
        
    }
    else        // 第一运行程序
    {
        int nNum = sizeof(HANDLE);
        
        // 创建文件映射内核对象
        HANDLE hHandle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(HANDLE), strMapFileGUID);

        if (hHandle)
        {
            // 拷贝数据到共享文件里
            LPTSTR lpMapAddr = (LPTSTR)::MapViewOfFile(hHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);

            CString strBuffer;
            strBuffer.Format(_T("%d"), hWnd);

            _tcscpy(lpMapAddr, strBuffer);

            // 讲写入文件映射缓冲区的所有数据刷新到磁盘;
            ::FlushViewOfFile(lpMapAddr, strBuffer.GetLength()+1);
        }
    }
}

 

转载于:https://www.cnblogs.com/calm2012/p/3336863.html

相关文章:

  • systemC的安装
  • 利用hadoop来解决“共同好友”的问题
  • zabbix监控apache
  • 创建Windows窗体 : WinMain() 与 WndProc()
  • 不要再被骗了------QQ盗号原理大揭秘
  • Heroku安装与使用
  • webpack 4.14配置详解
  • 中间有文字的分割线效果
  • ie6,ie7下overflow失效解决方法
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 关于DAMAGE: after Normal block的问题 【from http://blog.sina.com.cn/s/blog_a4864fde01014962.html】...
  • ispoweroftwo 判断2的次幂【转】
  • 用 puppeteer 获取 jd 商品评论
  • LightOJ 1033 区间dp
  • 多线程停止的方法
  • 0基础学习移动端适配
  • centos安装java运行环境jdk+tomcat
  • Javascript弹出层-初探
  • Java的Interrupt与线程中断
  • java概述
  • mongodb--安装和初步使用教程
  • PHP的类修饰符与访问修饰符
  • Service Worker
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue2.x学习三:事件处理生命周期钩子
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 力扣(LeetCode)21
  • 七牛云假注销小指南
  • 使用SAX解析XML
  • 译有关态射的一切
  • 由插件封装引出的一丢丢思考
  • 7行Python代码的人脸识别
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​Python 3 新特性:类型注解
  • ​人工智能书单(数学基础篇)
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Ubuntu(修改root信息)
  • (11)MSP430F5529 定时器B
  • (3)STL算法之搜索
  • (a /b)*c的值
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (编译到47%失败)to be deleted
  • (译)2019年前端性能优化清单 — 下篇
  • (转)3D模板阴影原理
  • ***详解账号泄露:全球约1亿用户已泄露
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net core 6 redis操作类
  • .net core 6 集成和使用 mongodb
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net接口调试与案例
  • .NET面试题(二)
  • @Autowired多个相同类型bean装配问题
  • @JsonSerialize注解的使用