类似于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/