• 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 }
  • 相关阅读:
    RuntimeError: cryptography is required for sha256_password or caching_sha2_p
    Django-C003-视图
    MySQL 实时监控日志
    ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) : 第一次设置MySQL也适用
    Django-C002-深入模型,到底有多深
    ubuntu16.04下安装&配置anaconda+tensorflow新手教程
    人脸算法系列:MTCNN人脸检测详解
    YOLO系列:YOLOv1,YOLOv2,YOLOv3,YOLOv4,YOLOv5简介
    python __getitem__()方法理解
    启动scala的方法
  • 原文地址:https://www.cnblogs.com/jojodru/p/2668473.html
Copyright © 2020-2023  润新知