使用 Win API 确定可执行文件的实例是否已在运行

2024-02-22

我需要确保我的 C++ 应用程序只有 1 个实例正在运行。

我该如何使用 Win API;

  1. 检索有关我当前应用程序的信息?GetCurrentProcess()会给我一个关于我的应用程序的句柄,我如何检索有关它的信息

  2. 检索用户所有正在运行的进程的列表?EnumProcesses()给出了一个列表,但似乎需要预先分配的缓冲区,那么我如何找出当前正在运行的进程有多少?

  3. 我需要将服务器的 exe 名称与正在运行的进程进行比较,如果发现多个,则引发错误

Note:我无法使用任何 boost 库,并且我对使用mutex,在类似的帖子中看到。


您可以使用CreateMutex函数创建一个系统范围的命名互斥体来表示您的进程是否正在运行。它会返回ERROR_ALREADY_EXISTS如果该进程已经在运行:

 (void)::CreateMutex( NULL,
                      TRUE,
                      TEXT( "My_Special_Invokation_Test_Mutex" ) );
 switch ( ::GetLastError() ) {
     case ERROR_SUCCESS:
         // Process was not running already
         break;
     case ERROR_ALREADY_EXISTS:
         // Process is running already
         break;
     default:
         // Error occured, not sure whether process is running already.
         break;
 }

现在,如果您坚持不使用互斥锁,则可以使用CreateFile http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx函数代替。确保传递零dwShareMode字段来获取独占访问语义,CREATE_NEW为了dwCreationDisposition字段(以便仅当文件尚不存在时才创建该文件)和FILE_FLAG_DELETE_ON_CLOSE为了dwFlagsAndAttributes参数,以便在进程终止后文件被删除。像这样的事情:

LPCTSTR lockFileName = ...;
(void)::CreateFile( lockFileName,
                    GENERIC_READ,
                    0,
                    NULL,
                    CREATE_NEW,
                    FILE_FLAG_DELETE_ON_CLOSE,
                    NULL );
switch ( ::GetLastError() ) {
     case ERROR_SUCCESS:
         // Process was not running already
         break;
     case ERROR_FILE_EXISTS:
         // Process is running already
         break;
     default:
         // Error occured, not sure whether process is running already.
         break;
}

请参阅这篇文章了解临时文件生成和使用最佳实践 http://blogs.msdn.com/b/secureapps/archive/2007/01/23/temporary-file-best-practices.aspx关于如何安全地处理临时文件。

长话短说,当然可以使用锁定文件来完成您的任务,但我认为正确地做到这一点比较困难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Win API 确定可执行文件的实例是否已在运行 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 从 C# 批量插入数据库的最佳方法是什么?

    我如何 什么是进行批量数据库插入的最佳方法 在 C 中 我迭代集合并为集合中的每个项目调用插入存储过程 如何在一次数据库调用中发送所有数据 例如 说我有一个人员名单 List
  • PHP:mb_strtoupper 不工作

    我对 UTF 8 和 mb strtoupper 有疑问 mb internal encoding UTF 8 guesstitlestring Le Courrier de S int Hy cinthe encoding mb dete
  • 如何使用 Selenium 和 Java 单击 reCAPTCHA

    为什么在尝试让驱动程序单击 reCAPTCHA 按钮时出现错误 这是我试图让它工作的网站 https rsps100 com vote 760 https rsps100 com vote 760 到目前为止 这是我当前的代码 WebEle
  • Visual Studio (VS2008)、Windows 窗体应用程序中的远程调试

    我正在尝试远程调试 Windows 窗体应用程序 C 但总是收到此错误 无法连接到 Microsoft Visual Studio 远程调试监视器 名为 XXX Visual Studio 遥控器 目标计算机上的调试器无法 连接回这台计算机
  • numpy 如何获取特定坐标处元素的值?

    我找到了获取 numpy 数组的最大值 然后获取坐标的方法 但是有没有办法做相反的事情 我的意思是 通过输入二维坐标来获取数组元素的值 非常感谢您的帮助 Cheers David 语法是A row number column number
  • Python 向上和向下计数循环

    我怎样才能简单地转换这个循环以从 1 计数到 100 并显示数字 我最近开始写代码了 倒数时效果很好 但我不知道如何让它从 1 100 example count 100 while count gt 0 print count count
  • Magento 管理员 404

    我们最近将多域 magento 设置从共享主机迁移到专用服务器 一切工作正常 但当我尝试进入管理部分时 登录后出现任何 404 错误 如果我从网址中删除index php 它似乎可以工作 但是一旦我单击管理部分中的另一个链接 它就会再次出现
  • 无法将按钮与水平形式对齐(非内联)(Bootstrap)

    在下面的代码中 我有 2 个按钮和 3 个带标签的输入 我希望按钮与输入对齐 但它们与标签对齐 我尝试过内联表单 但将标签放在侧面是行不通的 在不过度破坏引导程序的情况下完成此任务的最佳选择是什么
  • 在 Spark 结构化流中组合窗口 (groupBy) 和 mapGroupsWithState (groupByKey)

    目前使用 Spark 2 2 0 结构化流 给定带有水印的时间戳数据流 有没有办法结合 1 groupBy通过时间戳字段和其他分组标准实现窗口化的操作 2 groupByKey操作才能申请mapGroupsWithState到自定义会话组
  • 如何使用蓝牙在应用程序内发送.apk文件

    有什么办法可以发送吗 apk在应用程序内使用蓝牙文件 例如我们启动应用程序然后发送 apk使用应用程序内的共享图标文件 假设您想发送自己的应用程序 apk 这很简单 Get current ApplicationInfo to find a
  • 如何增加或减少listview每一行中edittext的值?

    我创建一个Listview in my Listview我有两个Buttons和一个Edittext In my Edittext我想增加价值Edittext as per Button的点击 我遵循了很多教程 但它仍然无法在我的Listv
  • 由于表单提交输入阻止,文本区域输入按键不起作用

    我有一个表单 其中使用了以下代码来防止按 Enter 键提交表单 因此 Enter 键在任何文本区域输入中都不起作用 由于主体功能 我无法输入新行 我该如何解决这个问题
  • jQuery 滚动事件:如何确定滚动量(滚动增量)(以像素为单位)?

    我有这个活动 window scroll function e console log e 我想知道我有多少滚动值 以像素为单位 因为我认为滚动值取决于窗口大小和屏幕分辨率 功能参数e不包含此信息 我可以存储 window scrollTo
  • Laravel/Angular:将 php 页面内的数据传递给 angularjs

    我有以下 laravel html blade 页面 我想传递一个storeid然后可以通过 Angular 获取它 然后使用它来获取并执行一些操作 以下是我现在如何实现它 但是有更好的方法来实现相同的效果吗 刀片部分 div p stor
  • 如何在 Xcode 控制台中禁用 os_log_info 和 os_log_debug 消息?

    用于日志记录的现代 API 可以在终端中轻松配置 然而 Xcode 似乎输出所有级别 包括 INFO 和 DEBUG 这非常烦人 因为大多数时候你只想看到os log error and NSLog又名 出了问题 和 这很重要 那么有没有办
  • 为什么 lambda 在抛出运行时异常时会更改重载?

    请耐心等待 介绍有点冗长 但这是一个有趣的谜题 我有这个代码 public class Testcase public static void main String args EventQueue queue new EventQueue
  • ProgressDialog 动画在较大的 setText() 上暂停

    我正在尝试在 EditText 中设置大文本 该操作可能需要 30 秒以上 因此我使用 ProgressDialog 它会显示 但没有动画 然后在操作完成后消失 这是我的简化代码 class FileOpener extends Async
  • 如何在点宏中访问案例类的参数列表

    我正在尝试在 dotty 中学习元编程 特别是编译时代码生成 我认为通过构建一些东西来学习是一个很好的方法 所以我决定制作一个 CSV 解析器 它将行解析为案例类 我想使用点宏来生成解码器 trait Decoder T def decod
  • 为什么需要 Server.HtmlEncode?

    我无法理解为什么需要 Server HtmlEncode MSDN 指出它用于将潜在不安全的字符编码为 HTML 编码的等效字符 有人可以告诉我这些字符如何不安全并要求我们使用 Server HtmlEncode 吗 Thanks 字符可能
  • 使用 Win API 确定可执行文件的实例是否已在运行

    我需要确保我的 C 应用程序只有 1 个实例正在运行 我该如何使用 Win API 检索有关我当前应用程序的信息 GetCurrentProcess 会给我一个关于我的应用程序的句柄 我如何检索有关它的信息 检索用户所有正在运行的进程的列表