c++ Windows - 如何从其路径获取进程PID

标签 c++ c windows

类似于C++ Windows - How to get process path from its PID但反过来:如何从给定路径获取 pid?

我正在尝试写一个更新工具,我想看看这个exe是否在使用中。然后如果正在使用,我想等待进程退出。因此,我想获取属于该文件的进程PID。

最佳答案

这是一种快速简单的方法来完成您正在寻找的事情。通过使用 QueryFullProcessImageName,您可以进行快速检查。

可能导致以下代码无法按预期工作的事情:

  • 如果您没有查看流程的权限,您将无法 能够看到信息。
  • 如果进程是 64 位的,而您正在以 32 位运行应用程序,您将看到进程 ID,但无法打开它的进程句柄。

例子:

BOOL GetProcessName(LPTSTR szFilename, DWORD dwSize, DWORD dwProcID)
{
    BOOLEAN retVal = FALSE;
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcID);
    DWORD dwPathSize = dwSize;
    if (hProcess == 0)
        return retVal; // You should check for error code, if you are concerned about this
    retVal = QueryFullProcessImageName(hProcess, 0, szFilename, &dwPathSize);

    CloseHandle(hProcess);

    return retVal;
}

BOOL IsProcessInUse(LPCTSTR process_name)
{
    DWORD* pProcs = NULL;
    DWORD dwSize = 0;
    DWORD dwRealSize = 0;
    TCHAR szCompareName[MAX_PATH + 1];
    int nCount = 0;
    int nResult = 0;

    dwSize = 1024;
    pProcs = new DWORD[dwSize];
    EnumProcesses(pProcs, dwSize*sizeof(DWORD), &dwRealSize);
    dwSize = dwRealSize / sizeof(DWORD);

    for (DWORD nCount = 0; nCount < dwSize; nCount++)
    {
        ZeroMemory(szCompareName, MAX_PATH + 1 * (sizeof(TCHAR)));
        if (GetProcessName(szCompareName, MAX_PATH, pProcs[nCount]))
        {
            if (_tcscmp(process_name, szCompareName) == 0)
            {
                delete[] pProcs;
                return true;
            }
        }
    }
    delete[] pProcs;
    return FALSE;
}

然后您可以使用如下简单的方法对其进行测试:

if (IsProcessInUse(your_file))
    AfxMessageBox(_T("The process is still running"));
else
    AfxMessageBox(_T("The process has been closed"));

以上回答了您的间接问题。要回答您的文字问题,您可以按如下方式更改 IsProcessInUse:

DWORD GetNamedProcessID(LPCTSTR process_name)
{
    DWORD* pProcs = NULL;
    DWORD retVal = 0;
    DWORD dwSize = 0;
    DWORD dwRealSize = 0;
    TCHAR szCompareName[MAX_PATH + 1];
    int nCount = 0;
    int nResult = 0;

    dwSize = 1024;
    pProcs = new DWORD[dwSize];
    EnumProcesses(pProcs, dwSize*sizeof(DWORD), &dwRealSize);
    dwSize = dwRealSize / sizeof(DWORD);

    for (DWORD nCount = 0; nCount < dwSize; nCount++)
    {
        ZeroMemory(szCompareName, MAX_PATH + 1 * (sizeof(TCHAR)));
        if (GetProcessName(szCompareName, MAX_PATH, pProcs[nCount]))
        {
            if (_tcscmp(process_name, szCompareName) == 0)
            {
                retVal = pProcs[nCount];
                delete[] pProcs;
                return retVal;
            }
        }
    }
    delete[] pProcs;
    return 0;
}

要注意的最后一件重要事情是,这只会返回文件的单个实例(或 PID),并且不会查找进程使用的模块(因此进程使用的任何 DLL 都不会但是,从您提供的链接中可以识别出如何利用它来获得该级别的功能。

关于c++ Windows - 如何从其路径获取进程PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23814979/

相关文章:

c++ - 想在 Qt 中存储配置文件,使用 SQLite 或其他东西?

c++ - 在运行时 C++ 中使用派生类

c++ - 有没有关于如何将包含文件夹和文件的 zip 文件解压缩到某个目录并通过 MiniZip 将它们打包回来的教程?

c++ - 全屏时 WS_CLIPCHILDREN 不起作用

Windows 10 WDK 计算机配置错误

c - VS 2015 中的 std::wcstok

c - 如何指定指向 void 的指针数组的返回类型?

c - 如何检查数组中的元素是否为地址?

c++ - 如何使用命名共享内存?

windows - 写一个只有 UTF-8 BOM 的空文件