【问题标题】:How do I find out if a .exe is running in c++?如何确定 .exe 是否在 C++ 中运行?
【发布时间】:2010-07-28 17:00:55
【问题描述】:

在给定进程名称的情况下,如何确定可执行文件是否在 Windows 上运行,例如程序.exe?

【问题讨论】:

  • 请重新表述您的问题。您想知道该程序是否是用 C++ 编写的吗?或者您想知道名称为 program.exe 的特定程序当前是否正在您的操作系统 (OS) 上运行?
  • @拜伦;我认为只有 MS-OS 使用 .exe 扩展名,不是吗?所以我的猜测是 Win2000 或更高版本,它产生的答案与我想的几乎相同。
  • @jacob 我的意思是我正在用 C++ 编写一个程序,我希望它查看 .exe 是否正在运行

标签: c++ winapi executable


【解决方案1】:

C++ 标准库没有这样的支持。您需要一个操作系统 API 来执行此操作。如果这是 Windows,那么您将使用 CreateToolhelp32Snapshot(),然后使用 Process32First 和 Process32Next 来迭代正在运行的进程。当心不可避免的竞争条件,当您找到它时,该过程可能已经退出。

【讨论】:

  • 注意:CreateToolhelp32Snapshot 在某些情况下不会按预期运行;它经常报告错误数量的 svchost.exe。 :/ 不过对于大多数用途来说应该没问题。
  • @blood:这是一个“这是在 Windows 上执行此操作的方法”的答案。您的“必须有办法”的回答令人费解,并且无视任何想出更好答案的尝试。
  • 对不起,我没看错,我以为他说在大多数情况下都行不通:D 对不起
【解决方案2】:

我刚刚使用 Hans 的建议创建了一个。像冠军一样工作!

哦,这是基本代码。

请您添加 CStrings sAppPath 和 sAppName。

StartProcess 是一个使用 CreateProcess 并返回 PID 的小函数(此处未使用)。您需要更换它。

这不是一个完整的程序,只是使用 Hans 建议查找程序是否正在运行的代码。一个有趣的测试是将路径设置为 c:\windows\ 并将应用设置为 notepad.exe 并设置为 10 秒。

#include <tlhelp32.h>
PROCESSENTRY32 pe32 = {0}; 
HANDLE    hSnap;
int       iDone;
int       iTime = 60;
bool      bProcessFound;

while(true)    // go forever
{
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    Process32First(hSnap,&pe32);     // Can throw away, never an actual app

    bProcessFound = false;   //init values
    iDone = 1;

    while(iDone)    // go until out of Processes
    {
        iDone = Process32Next(hSnap,&pe32);
        if (strcmp(pe32.szExeFile,sAppName) == 0)    // Did we find our process?
        {
            bProcessFound = true;
            iDone = 0;
        }
    }

    if(!bProcessFound)    // if we didn't find it running...
    {
        startProcess(sAppPath+sAppName,"");             // start it
    }
    Sleep(iTime*1000);    // delay x amount of seconds.
}

【讨论】:

  • 这应该是一个评论,因为这不能回答问题。尽管这个问题已经很老了,甚至没有远程添加任何内容,但您甚至不应该发布任何内容。
  • 添加了代码 Falmarri。我真的没想到这有什么大不了的。只是想表扬一下。
  • 注意这段代码的内存泄漏:hSnap需要用::CloseHande释放
【解决方案3】:

假设:既然您提到了“.exe”,那么您希望它用于某种 Windows 风格。您想用 C++ 编写一个程序,以确定具有特定可执行名称的程序是否正在运行(无论用于实现目标程序的语言是什么)。

使用 Toolhelp API 或进程状态 API 枚举正在运行的进程。将每个正在运行的进程的可执行文件名称与您要查找的进程进行比较(并注意可能有多个进程具有该可执行文件名称)。

【讨论】:

    【解决方案4】:
    hProcessInfo = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
    
                do{
                    if(strcmp(pe32.szExeFile,"process.exe") == 0)
                    {
                        processfound = true;
                        break;
                    }
    }while( Process32Next( hProcessSnap, &pe32 ) );
    

    如果您不想从代码中获取流程详细信息,只需按 Ctrl+Alt+Del 并检查流程列表。

    【讨论】:

    • 如果这是“测试代码”,可能测试结果是否定的?考虑到没有调用Process32First,如果这行得通,那将是相当令人惊讶的。
    • 我的猜测是你对上面的例子做了一个修改的sn-p,但是不清楚怎么用。请提供一个完整的例子。
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2023-03-09
    • 2012-09-17
    相关资源
    最近更新 更多