码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 程序单实例运行的一种实现


    技术背景知识

    来自《Windows核心编程》
    在这里插入图片描述
    在这里插入图片描述

    创建自定义段 Section

    来自《Windows核心编程》
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    举例(获取当前总共运行的实例数)

    • 创建自定义段并设置属性

      #include "stdafx.h"
      #include "MFCApplication1.h"
      #include "MFCApplication1Dlg.h"
      
      //创建自定义段
      #pragma data_seg("MyShare")
      volatile long g_nAppInstCount = 0;
      #pragma data_seg()
      
      //设置段的属性:RWS, 可读、可写、可共享
      #pragma comment(linker, "/SECTION:MyShare,RWS")
      
      
      #ifdef _DEBUG
      #define new DEBUG_NEW
      #endif
      
      
      //....
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
    • 访问共享实例

      // CMFCApplication1App 初始化
      
      BOOL CMFCApplication1App::InitInstance()
      {
      	//
      	//略
      	//
      	
      	CWinApp::InitInstance();
      
      	//g_nAppInstCount加一
      	InterlockedExchangeAdd(&g_nAppInstCount, 1);
      
      
      	//
      	//略
      	//
      
      	//弹框显示实例数
      	CString strMsg;
      	strMsg.Format(_T("已运行实例个数%ld"), g_nAppInstCount);
      	AfxMessageBox(strMsg);
      
      	CMFCApplication1Dlg dlg;
      	m_pMainWnd = &dlg;
      	INT_PTR nResponse = dlg.DoModal();
      	
      	//
      	//略
      	//
      
      	//g_nAppInstCount减一
      	InterlockedExchangeAdd(&g_nAppInstCount, -1);
      
      	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
      	//  而不是启动应用程序的消息泵。
      	return FALSE;
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
    • 实例崩溃时,g_nAppInstCount不会减1,但所有实例都终止后,再运行,g_nAppInstCount会重置

    • dumpbin.exe查看生成的exe
      在这里插入图片描述

    程序单实例运行的实现

    • 使用上文提到的技术,在一个exe的多个实例中可以共享一个g_AppInstCount,只要此值大于0,就说明有实例在运行了。
    • CreateMutex创建一个命名的互斥器,名字需要唯一,如果当前已存在,GetLastError会返回ERROR_ALREADY_EXISTS,故可根据这个事实来实现单实例运行。
  • 相关阅读:
    Go语言函数基本概念
    让 K8s 更简单!8款你不得不知的 AI 工具-Part 2
    条件渲染(v-if、v-show)、列表渲染(v-for)、列表中key的原理和作用、列表过滤(filter)、列表排序(sort)
    大数据项目之电商数仓DataX、DataX简介、DataX支持的数据源、DataX架构原理、DataX部署
    中秋之际献上【中秋快乐】藏头诗
    自媒体平台上剪视频的素材都是从哪来的?
    细粒度图像分类论文研读-2016
    OpenCV自学笔记十一:形态学操作(一)
    玩转Mysql系列 - 第17篇:存储过程&自定义函数详解
    推荐一个在线ide的网站
  • 原文地址:https://blog.csdn.net/s634772208/article/details/132899223
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号