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

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

  1. //File Name: Singleton.h
  2. #pragma once
  3.  
  4. class Singleton
  5. {
  6. private:
  7. CString strGUID;
  8. CString strMapFileGUID;
  9.  
  10. HANDLE m_hSingleton;
  11.  
  12. public:
  13. Singleton();
  14. ~Singleton();
  15. public:
  16. void AppStart (const HWND & hWnd) const;
  17. };
  1. //File Name: Singleton.cpp
  2.  
  3. #include "stdafx.h"
  4. #include "Singleton.h"
  5.  
  6. Singleton::Singleton()
  7. {
  8. strGUID = _T("{D727BDB5-F86A-405b-910D-11AD2A4CA76E}");
  9. strMapFileGUID = strGUID + _T("_MapFile");
  10. m_hSingleton = NULL;
  11. }
  12.  
  13. Singleton::~Singleton()
  14. {
  15. if (m_hSingleton)
  16. {
  17. CloseHandle(m_hSingleton);
  18. m_hSingleton = NULL;
  19. }
  20. }
  21.  
  22. void Singleton::AppStart(const HWND & hWnd) const
  23. {
  24. HANDLE m_hSingleton = NULL;
  25. m_hSingleton = CreateMutex(NULL, TRUE, strGUID);
  26. RECT rect;
  27.  
  28. ZeroMemory(&rect, sizeof(rect));
  29. ::GetWindowRect(hWnd, &rect);
  30.  
  31. if (GetLastError() == ERROR_ALREADY_EXISTS)
  32. {
  33. // 打开共享文件
  34. HANDLE hHandle = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, strMapFileGUID);
  35. if (hHandle)
  36. {
  37. LPTSTR lpMapAddr = (LPTSTR)::MapViewOfFile(hHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  38. CString strBuffer(lpMapAddr);
  39.  
  40. HWND hOldWnd = (HWND)_tcstoul(strBuffer, NULL, 10);
  41. ::SetForegroundWindow(hOldWnd);
  42.  
  43. // 取消内核对象的映射
  44. UnmapViewOfFile(hHandle);
  45.  
  46. CloseHandle(hHandle);
  47.  
  48. exit(0);
  49. }
  50.  
  51. }
  52. else // 第一运行程序
  53. {
  54. int nNum = sizeof(HANDLE);
  55.  
  56. // 创建文件映射内核对象
  57. HANDLE hHandle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(HANDLE), strMapFileGUID);
  58.  
  59. if (hHandle)
  60. {
  61. // 拷贝数据到共享文件里
  62. LPTSTR lpMapAddr = (LPTSTR)::MapViewOfFile(hHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  63.  
  64. CString strBuffer;
  65. strBuffer.Format(_T("%d"), hWnd);
  66.  
  67. _tcscpy(lpMapAddr, strBuffer);
  68.  
  69. // 讲写入文件映射缓冲区的所有数据刷新到磁盘;
  70. ::FlushViewOfFile(lpMapAddr, strBuffer.GetLength()+1);
  71. }
  72. }
  73. }

C++ 运行单个实例,防止程序多次启动的更多相关文章

  1. qt编写一个只能运行单个实例的程序,不用Windows API

    QtSingleApplicationhttp://code.qt.io/cgit/qt-solutions/qt-solutions.git/tree/qtsingleapplication 已打开 ...

  2. vc++高级班之窗口篇[4]---让程序只运行一个实例

      大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...

  3. Linux编程之《只运行一个实例》

    概述 有些时候,我们要求一个程序在系统中只能启动一个实例.比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例.原因很简单,如果同时启动几个实 ...

  4. opencv 应用程序无法正常启动(0xooooo7b)

    #include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui ...

  5. win应用只允许单个实例运行,并将已运行实例窗口置顶

    关键词:windows,c++,桌面应用,单个实例,窗口置顶 目标:1.判断本程序是否已有一个实例在运行.2.若有,则激活已在运行的实例(将其窗口置顶),并退出当前运行. 1.使用semaphore来 ...

  6. C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper

    前言 在开发应用程序时,通常只让程序运行一个实例.所以,就要判断程序是否已经运行. 下面是我自己在项目中使用到,封装好的帮助类.有 普通的 C# 应用程序 和 Windows CE 和 Windows ...

  7. 解决C#程序只允许运行一个实例的几种方法详解

    解决C#程序只允许运行一个实例的几种方法详解 本篇文章是对C#中程序只允许运行一个实例的几种方法进行了详细的分析介绍,需要的朋友参考下 本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运 ...

  8. C#让应用程序只运行一个实例的几种方法

    一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...

  9. C# WINFORM判断程序是否运行,且只能运行一个实例(转)

    判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading. ...

随机推荐

  1. Navicat 连接 MySQL

    目录 简述 新建连接 常见错误 简述 Navicat 是一套快速.可靠和全面的数据库管理工具,专门用于简化数据库管理和降低管理成本.Navicat 图形界面直观,提供简便的管理方法,设计和操作 MyS ...

  2. pycharm相关介绍

    一.settings设置   1.搜font 设置字体 2.Keymap------快捷键 二.常用快捷键 1.Ctrl + Enter:在下方新建行但不移动光标: 2.Shift + Enter:在 ...

  3. Linux(Centos7)静默安装Oracle19C

    Oracle数据库服务器一般都是Linux,Linux服务器一般都是在非图形界面的操作,本文章手把手教你如何在非图形界面安装Oracle19C. ORACLE 19C 的安装包自行在官网下载,下载免费 ...

  4. 判断语句、if嵌套

    判断语句 上一篇我们使用了一下if语句当然我们不止这些 我们上一个只是判断出如果满足条件会执行,那么我们想一想如果不能满足该会怎么样! 当然 还有一种语句叫做if else 他的语法格式是: if ( ...

  5. MongoDB学习总览

    第1部分: MongoDB入门(第1~6章) 该部分介绍MongoDB的基本概念及入门知识. 通过该部分的学习,读者可对MongoDB自身的技术全貌形成一定的认识. 第2部分: MongoDB微服务开 ...

  6. Java使用类-String

    String,StringBuffer,StringBuild 大佬的理解-><深入理解Java中的String> 1.String 1.1 String 实例化 String st ...

  7. Spring Security:用户和Spring应用之间的安全屏障

    摘要:Spring Security是一个安全框架,作为Spring家族的一员. 本文分享自华为云社区<[云驻共创]深入浅出Spring Security>,作者:香菜聊游戏. 一.前言 ...

  8. 如何搭建android源代码repo仓库

    如何搭建android源代码repo仓库 目录 如何搭建android源代码repo仓库 1 repo是如何管理仓库的? 1.1 repo如何工作的? 1.2 搭建repo服务需要做哪些事情? 2 部 ...

  9. Graph Neural Networks:谱域图卷积

    以下学习内容参考了:1,2, 0.首先回忆CNN,卷积神经网络的结构和特点 处理的数据特征:具有规则的空间结构(Euclidean domains),都可以采用一维或者二维的矩阵描述.(Convolu ...

  10. Linux操作系统(6):进程管理和服务管理

    进程的基本介绍 1)在 LINUX 中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个 ID 号. 2)每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程.例如 www 服务器 ...