Win32创建后台进程
创建后台进程之前先判断进程时候有在运行,如果有,则直接返回,否则创建。
创建后台进程,放进单独线程里面做比较好,然后在其他线程可以同时做一些初始化或者其他的工作,当然这些工作必须和
后台没有联系,和后台有联系的必须放在后台创建完成之后。本例子以创建adb后台server为例做的。
废话不多少,代码如下:
1 #include <Tlhelp32.h> 2 3 #define DEAMON_FILE _T("adb.exe") 4 BOOL IsProcessIsRun(LPCTSTR lpProcessName); 5 6 BOOL IsProcessIsRun(LPCTSTR lpProcessName) //判断指定的Exe程序是否正在运行,当前进程除外 7 { 8 DWORD ID; 9 DWORD ProcessID=GetCurrentProcessId(); //记录当前程序的ID 10 11 PROCESSENTRY32 pe; //记录各个进程的数据 12 memset(&pe,0x00,sizeof(PROCESSENTRY32)); 13 pe.dwSize=sizeof(PROCESSENTRY32); 14 HANDLE hSnapshot=NULL; 15 hSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //记录系统进程列表快照 16 BOOL result = FALSE; 17 result = Process32First(hSnapshot,&pe); //开始列举所有的进程 18 19 while(result) 20 { 21 ID=pe.th32ProcessID; 22 if(ID==ProcessID) 23 { 24 result=Process32Next(hSnapshot,&pe); 25 continue; 26 } 27 if(_tcsicmp(pe.szExeFile, lpProcessName) == 0) 28 { 29 return TRUE; 30 } 31 result=Process32Next(hSnapshot,&pe); 32 } 33 CloseHandle(hSnapshot); 34 35 return FALSE; 36 } 37 38 BOOL ExecuteAdbDeamon(void) 39 { 40 if(IsProcessIsRun(DEAMON_FILE)) 41 return TRUE; 42 43 TCHAR szPath[MAX_PATH] = {0}; //保存程序运行的绝对路径 44 CString strExe; //守护进程的完整路径名 45 if (GetCurrentDirectory(MAX_PATH - 1, szPath)) 46 { 47 CString strPath = szPath; 48 if(strPath.GetAt(strPath.GetLength() - 1) != _T('\\')) 49 strPath += _T("\\"); 50 strExe = strPath + DEAMON_FILE; 51 } 52 53 SHELLEXECUTEINFO se; 54 ZeroMemory(&se, sizeof(SHELLEXECUTEINFO)); 55 se.cbSize = sizeof(SHELLEXECUTEINFO); 56 se.fMask = SEE_MASK_NOCLOSEPROCESS; 57 se.lpVerb = _T("open"); 58 se.lpFile = strExe; 59 se.lpParameters = _T("start-server"); 60 61 BOOL bRet = ShellExecuteEx(&se); //命令执行必须在守护进程执行完之后 62 if (bRet && se.hProcess) 63 { 64 WaitForSingleObject(se.hProcess, INFINITE); 65 CloseHandle(se.hProcess); 66 } 67 else 68 { 69 exit(1); 70 } 71 }