c++ - 如何查找给定应用程序是否为单实例?

标签 c++ windows process createprocess single-instance

我正在寻找一种有效的方法来确定给定的应用程序(比如 app.exe)是否是单实例?我想到了以下这些 sol:

  1. 执行两次 CreateProcess() 并检查该应用程序是否有两个或更多实例在运行?如果不是,则为单实例应用程序。但是,这效率不高。
  2. 执行 CreateProcess() 并等待 1-2 秒。如果这个实例被杀死(因为已经有一个实例在为它运行),它将是单实例应用程序。

但我对以上两个 sol 都不满意。在 Windows 中还有其他有效的方法吗?

请注意,我不会终止该应用程序的已运行(如果有)实例或对其进行任何修改。

最佳答案

换个角度想:你写程序的时候,怎么规定是单实例还是多实例?有没有其他程序可以在不运行程序的情况下从您的程序中获取该信息的方法? (一旦你回答了这个问题,你的问题就有了答案。)

这个问题一般无法解决,因为单实例/多实例是在运行时确定的,可以基于运行时条件。例如,某些应用程序是“有时是多实例,有时是单实例”:如果您运行应用程序打开文档 X,然后打开文档 Y,您将获得两个实例。但是,如果您打开文档 X,然后再次打开文档 X,则这两个实例将合并为一个。其他应用程序可能有一个配置开关,可以让您选择它们​​是单实例还是多实例。或者他们可能决定掷硬币并决定如果反面是单例,如果是正面则为多例。

关于c++ - 如何查找给定应用程序是否为单实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6516121/

相关文章:

c++ - 如何隐藏 QSplitter 小部件中的句柄?

linux - Windows 程序内存与 Linux 程序内存

python - 如何处理子进程异常终止?

c++ - 无法写入 AllocConsole()

c++成员函数模板专门化类非类型模板参数

c++ - ntoh功能在RHEL/GCC下是如何实现的?

Python 将子进程重定向到文件和控制台

windows - 挂起的进程是否仍会消耗 CPU/RAM?

C# 程序在关闭表单后继续在进程中运行

c# - 重定向标准输出