进程的创建和管理

一:进程的创建

 

1 WIN32API 函数CreateProcess 用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

BOOL CreateProcess

(

  LPCTSTR lpApplicationName// 指向可执行文件名指针,WINCE 中不可为NULL

  LPTSTR lpCommandLine// 可执行命令字符串指针

  LPSECURITY_ATTRIBUTES lpProcessAttributes //WINCE 不支持

  LPSECURITY_ATTRIBUTES lpThreadAttributes ,   //WINCE 不支持   

  BOOL bInheritHandles//WINCE 不支持    

  DWORD dwCreationFlags , // 创建标志

  LPVOID lpEnvironment ,   //WINCE 不支持   

  LPCTSTR lpCurrentDirectory//WINCE 不支持    

  LPSTARTUPINFO lpStartupInfo//WINCE 不支持    

  LPPROCESS_INFORMATION lpProcessInformation // 进程信息结构体指针

  );

 

// 函数描述:调用可执行文件

bool CCreateProgressDlg ::WinExec (LPCTSTR FileName )

{

     PROCESS_INFORMATION processInfo ; // 进程相关信息

     if (!CreateProcess (FileName , NULL , NULL , NULL , NULL , CREATE_NEW_CONSOLE , NULL , NULL , NULL , &processInfo ))

     {

         return false ;

     }

     CloseHandle (processInfo .hThread );

     CloseHandle (processInfo .hProcess );

     return true ;

}

 

// 调用外部应用程序

void CCreateProgressDlg ::OnBnClickedBtnexec ()

{

     WinExec (_T ("iexplore" ));   

}

 

二:进程的管理,需要包含头文件 #include   <tlhelp32.h>    ,并引入toolhelp .lib

 

1 :进程列取并管理

// 定义用到的常量

#define TITLE_SIZE           64        // 标题字符串的大小

#define PROCESS_SIZE         MAX_PATH   // 进程名字符串的大小

#define MAX_TASKS            25        // 最大进程数

 

// 定义进程信息结构

typedef struct _TASK_LIST { 

     DWORD dwProcessId ;// 进程标识

     DWORD cntThreads ; // 此进程中的线程数

     HWND         hwnd ; // 进程主窗口句柄

     TCHAR        ProcessName [PROCESS_SIZE ]; // 进程Exe 文件名

     TCHAR        WindowTitle [TITLE_SIZE ]; // 主窗口标题名

} TASK_LIST , *PTASK_LIST ;

 

// 定义进程信息列表结构

typedef struct _TASK_LIST_ENUM {

     PTASK_LIST   tlist ; // 进程信息列表

     DWORD        numtasks ; // 进程数

} TASK_LIST_ENUM , *PTASK_LIST_ENUM ;

 

BOOL Ctest1Dlg ::OnInitDialog ()

{

     CDialog ::OnInitDialog ();

     // 设置进程列表框标题  

     CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem (IDC_LISTPROCESS );

 

     CRect rt ;

     pListCtrl ->GetClientRect (&rt );

     pListCtrl ->InsertColumn (0,_T (" 进程名" ), LVCFMT_LEFT , rt .Width () * 0.35);

     pListCtrl ->InsertColumn (1,_T (" 主窗体标题" ), LVCFMT_LEFT , rt .Width () * 0.35);

     pListCtrl ->InsertColumn (2, _T (" 线程数" ), LVCFMT_LEFT , rt .Width () * 0.30);

 

     return TRUE// return TRUE  unless you set the focus to a control

}

 

 

//* 函数介绍:刷新按钮单击事件

void Ctest1Dlg ::OnBnClickedBtnrefresh ()

{

     TASK_LIST_ENUM processList ; // 进程列表信息

     TCHAR numBuf [10]; // 存储进程中的线程数

 

     memset (&g_tlist , 0, sizeof (TASK_LIST ) * MAX_TASKS );

     // 得到进程列表信息

     DWORD nNumTasks = GetTaskListCE (g_tlist );

     processList .numtasks = nNumTasks ;

     processList .tlist = g_tlist ;

     // 更新进程列表信息,获取主窗口句柄和标题

     GetWindowTitles (&processList );

 

     CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem (IDC_LISTPROCESS );

 

     // 清除列表框所有项目

     pListCtrl ->DeleteAllItems ();

     memset (&numBuf ,0,sizeof (numBuf ));

 

     // 向列表框中添加进程相关信息

     for (int i =0;i <processList .numtasks ;i ++)

     {

         // 进程exe 名,标题名,线程数

         pListCtrl ->InsertItem (i ,_T ("Test" ));

         pListCtrl ->SetItemText (i ,0,processList .tlist [i ].ProcessName );

         pListCtrl ->SetItemText (i ,1,processList .tlist [i ].WindowTitle );   

         _itow (processList .tlist [i ].cntThreads ,numBuf ,10);

         pListCtrl ->SetItemText (i ,2,numBuf );

     }

 

}

 

 

// 函数介绍:激活进程按钮单击事件

void Ctest1Dlg ::OnBnClickedBtnactive ()

{

     CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem (IDC_LISTPROCESS );

     POSITION pos = pListCtrl ->GetFirstSelectedItemPosition ();

     if (pos )

     {

         int nItemIndex = pListCtrl ->GetNextSelectedItem (pos );

         // 激活进程

         ActivateProcess (&g_tlist [nItemIndex ]);

     }

}

 

// 函数介绍:终止进程按钮单击事件

void Ctest1Dlg ::OnBnClickedBtnterminate ()

{

     CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem (IDC_LISTPROCESS );

     POSITION pos = pListCtrl ->GetFirstSelectedItemPosition ();

     if (pos )

     {

         int nItemIndex = pListCtrl ->GetNextSelectedItem (pos );

         // 终止进程

         KillProcess (&g_tlist [nItemIndex ]);

     }

     // 刷新进程列表

     SendMessage (WM_COMMAND , (WPARAM )IDC_BTNREFRESH , 0);

}

 

// 函数介绍:得到CE 系统中运行的任务列表

// 出口参数:pList :存储得到任务列表信息

// 返回值:返回得到的任务数

DWORD Ctest1Dlg ::GetTaskListCE ( PTASK_LIST pList ) {

 

     HINSTANCE          hKernel         = NULL ;

     HINSTANCE          hProcessSnap    = NULL ;

     PROCESSENTRY32 pe32            = {0};

     DWORD           dwTaskCount     = 0;

 

     // 状态toolhelp.dll 动态连接库

     hKernel = LoadLibrary (_T ("toolhelp.dll" ));

 

     if (!hKernel )

     {

         ::MessageBox (NULL , L "Toolhelp.dll 加载失败" , L " 进程列举" , MB_OK );

         return 0;

     }

 

     // 创建进程映射

     hProcessSnap = (HINSTANCE )CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS , 0);

 

     // 如果失败,就退出

     if (hProcessSnap == (HANDLE )-1)

         return 0;

 

     dwTaskCount = 0;

 

     // 设置保存进程相关内容的变量的结构大小         

     pe32 .dwSize = sizeof (PROCESSENTRY32 );

     // 获取第一个进程,并将此进程信息写入进程结构的变量pe32       

     if (Process32First (hProcessSnap , &pe32 ))

     {

         do

         {

              LPTSTR pCurChar ;

 

              if (_tcsstr (pe32 .szExeFile , L "//" ))

                   pCurChar = _tcsrchr (pe32 .szExeFile , '//' );

              else

                   pCurChar = pe32 .szExeFile ;

 

              lstrcpy (pList -> ProcessName , pCurChar );

 

              pList ->dwProcessId = pe32 .th32ProcessID ;

              pList ->cntThreads = pe32 .cntThreads ;

 

              ++dwTaskCount ;   // 进程数目加

              ++pList ;         // 移到下一个结构内存块

         }

         while (Process32Next (hProcessSnap , &pe32 )); // 移至下一个进程

     }

     else

         dwTaskCount = 0;    //

 

     CloseHandle (hProcessSnap );

     return dwTaskCount ;

}

 

 

// 函数介绍:得到任务的主窗体标题和句柄

// 入口参数:te :进程信息列表指针

// 出口参数:te :进程信息列表指针

void Ctest1Dlg ::GetWindowTitles ( PTASK_LIST_ENUM te ) {

     // enumerate all windows

     EnumWindows ((WNDENUMPROC ) EnumWindowsProc , (LPARAM ) te );

}

 

// 函数介绍:回调函数,被EnumWindows 调用

// 入口参数:hwnd :窗体句柄

//          lParam : 进程信息列表指针

// 出口参数:lParam :进程信息列表指针

BOOL CALLBACK Ctest1Dlg ::EnumWindowsProc ( HWND hwnd , DWORD lParam ) {

     DWORD              pid = 0;

     DWORD               i ;

     TCHAR              buf [TITLE_SIZE ];

     PTASK_LIST_ENUM    te = (PTASK_LIST_ENUM )lParam ;

     PTASK_LIST         tlist = te ->tlist ;

     DWORD              numTasks = te ->numtasks ;

 

     // 根据窗口句柄,得到进程标识

     if (!GetWindowThreadProcessId ( hwnd , &pid ))

     {

         return TRUE ;

     }

     // 查找进程标识和列表中相同的进程标识

     for (i =0; i <numTasks ; i ++)

     {

         if (tlist [i ].dwProcessId == pid )

         {

              if (::IsWindowVisible (hwnd ))

              {

                   tlist [i ].hwnd = hwnd ;

                   int nCnt = ::GetWindowText ( hwnd , buf , TITLE_SIZE );

                   buf [nCnt ] = '/0' ;

                   if (nCnt )

                   {

                       lstrcpy ( tlist [i ].WindowTitle , buf );

                   }

              }

              break ;

         }

     }

     // 继续列举窗体

     return TRUE ;

}

 

// 函数介绍:激活进程方法

// 入口参数:tlist :进程信息

// 出口参数:()

// 返回值: True :成功;False :失败

bool Ctest1Dlg ::ActivateProcess (PTASK_LIST tlist )

{

     // 判断是否存在主窗口,如存在就激活它

     if (tlist ->hwnd && tlist ->WindowTitle )

     {

         ::SetForegroundWindow (tlist ->hwnd );

         ::SetActiveWindow (tlist ->hwnd );

         return TRUE ;

     }

     else

     {

         return FALSE ;

     }

}

 

// 函数介绍:终止进程方法

// 入口参数:tlist :进程信息

// 出口参数:()

bool Ctest1Dlg ::KillProcess ( PTASK_LIST tlist )

{

     HANDLE             hProcess ;

 

     // 如果没有主窗体, 则用TerminateProcess 终止进程

     if (!tlist ->hwnd

     {

         // 根据进程标识,返回进程句柄

         hProcess = OpenProcess ( PROCESS_ALL_ACCESS , FALSE , tlist ->dwProcessId );

         // 成功的话,终止进程

         if (hProcess )

         {

              if (!TerminateProcess ( hProcess , 1 ))

              {

                   CloseHandle ( hProcess );

                   return FALSE ;

              }

              CloseHandle ( hProcess );

              return TRUE ;

         }

         else

         {

              return FALSE ;

         }

     }

     // 有主窗体,发送主窗口关闭消息,终止线程

     else

     {

         ::PostMessage ( tlist ->hwnd , WM_CLOSE , 0, 0 );

         return TRUE ;

     }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值