进程状态的判断包括验证进程是否存在,实现方法是通过枚举系统内的所有进程信息,并将该进程名通过CharLowerBuff
转换为小写,当转换为小写模式后则就可以通过使用strcmp
函数对比,如果发现继承存在则返回该进程的PID信息,否则返回-1。
int GetProcessStatus(const char *procressName) { char pName[MAX_PATH]; strcpy(pName, procressName); CharLowerBuff(pName, MAX_PATH); PROCESSENTRY32 currentProcess; currentProcess.dwSize = sizeof(currentProcess); HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE != hProcess) { BOOL bMore = Process32First(hProcess, ¤tProcess); while (bMore) { CharLowerBuff(currentProcess.szExeFile, MAX_PATH); if (strcmp(currentProcess.szExeFile, pName) == 0) { CloseHandle(hProcess); return currentProcess.th32ProcessID; } bMore = Process32Next(hProcess, ¤tProcess); } CloseHandle(hProcess); } return -1; }
|
有时候我们需要判断自身进程是否被重复运行了,这种需求在软件开发中经常会遇到,通常该需求可以使用CreateMutex
创建或打开一个互斥量对象(Mutex Object
),在多线程/进程的环境下,互斥量可用于控制对某个共享资源的访问。其函数声明如下:
HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName );
|
其中,lpMutexAttributes
是用于指定新创建的互斥量的安全描述符的指针;bInitialOwner
表示一个布尔值,指定初始所有权标记,为 TRUE
表示调用线程将拥有该互斥量,否则表示它不属于调用线程;lpName
是可选的,用于命名互斥体,以使得其他线程或者进程可以通过这个名字来打开该互斥量对象。
CreateMutex 函数会返回一个内核对象句柄,用于在之后对该互斥体进行引用和操作,通过使用互斥体可以很容易的实现对进程运行状态的判断。
#include <Windows.h> #include <stdio.h>
BOOL IsAlreadyRun() { HANDLE hMutex = NULL; hMutex = CreateMutex(NULL, FALSE, "RUN"); if (hMutex) { if (ERROR_ALREADY_EXISTS == GetLastError()) return TRUE; } return FALSE; }
int main(int argc, const char * argv[]) { if (IsAlreadyRun() == TRUE) printf("重复运行 \n"); else printf("没有重复运行 \n");
system("pause"); return 0; }
|
对进程位数的判断也是有必要的,通常在Windows系统下进程位数的有多种方法实现,第一种方式GetNativeSystemInfo
调用该函数并判断函数内的特定成员,即可得到当前系统是否为64位,当然通过使用Is64BitPorcess
函数也可实现对特定进程的判断,此方式实现原理是通过调用IsWow64Process
函数实现;
#include <stdio.h> #include <Windows.h> #include <tlhelp32.h>
BOOL IsSelf64bitSystem() { SYSTEM_INFO si; GetNativeSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) return TRUE; else return FALSE; }
BOOL Is64BitPorcess(DWORD dwProcessID) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID); if (hProcess) { typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process"); if (NULL != fnIsWow64Process) { BOOL bIsWow64 = FALSE; fnIsWow64Process(hProcess, &bIsWow64); CloseHandle(hProcess); if (bIsWow64) return FALSE; else return TRUE; } } return FALSE; }
int main(int argc, char *argv[]) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); BOOL bMore = Process32First(hProcessSnap, &pe32);
while (bMore) { printf("进程PID: %5d 是否64位: %d 进程名称: %s\n", pe32.th32ProcessID, Is64BitPorcess(pe32.th32ProcessID), pe32.szExeFile);
bMore = Process32Next(hProcessSnap, &pe32); } system("pause"); return 0; }
|