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 }
原文地址:https://www.cnblogs.com/jojodru/p/2668473.html