【发布时间】:2009-07-29 18:03:15
【问题描述】:
我有一个 VC++ 控制台应用程序,我需要检查是否有另一个进程正在运行。我没有窗口标题,我只有可执行文件名。我如何获得它的进程句柄/PID?我可以枚举使用这个 .exe 运行的进程吗?
【问题讨论】:
-
此问题适用于 VB,但 API 调用也应适用于 C++:stackoverflow.com/questions/1143301/…
我有一个 VC++ 控制台应用程序,我需要检查是否有另一个进程正在运行。我没有窗口标题,我只有可执行文件名。我如何获得它的进程句柄/PID?我可以枚举使用这个 .exe 运行的进程吗?
【问题讨论】:
hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
紧随其后的是Process32First 和Process32Next。
您将获得一个PROCESSENTRY32 结构,如下所示,其中包含一个 szExeFile 成员。
PROCESSENTRY32W processInfo;
processInfo.szExeFile
确保在枚举之前首先获得特权SeDebugPrivilege,这样您将获得所有会话和用户的所有进程。
获取特权以便获得所有会话:
acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege
acquirePrivilegeByName 定义为:
BOOL acquirePrivilegeByName(
const TCHAR *szPrivilegeName)
{
HANDLE htoken;
TOKEN_PRIVILEGES tkp;
DWORD dwerr;
//---------------- adjust process token privileges to grant privilege
if (szPrivilegeName == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid)))
return FALSE;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
return FALSE;
if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) ||
GetLastError() != ERROR_SUCCESS) // may equal ERROR_NOT_ALL_ASSIGNED
{
dwerr = GetLastError();
CloseHandle(htoken);
SetLastError(dwerr);
return FALSE;
}
CloseHandle(htoken);
SetLastError(ERROR_SUCCESS);
return TRUE;
} //acquirePrivilegeByName()
如果您需要完整的进程映像名称,您可以使用QueryFullProcessImageName,但 szExeFile 成员可能足以满足您的需要。
【讨论】:
您可以使用EnumProcesses 枚举系统上的进程。
您需要使用 OpenProcess 获取进程句柄,然后使用 QueryFullProcessImageName 获取进程可执行文件。
【讨论】: