win32 启动和结束进程

来源:互联网 发布:数据分析兼职平台 编辑:程序博客网 时间:2024/05/17 21:06

CreateProcess函数的最后一个参数是一个指向PROCESS_INFORMATION结构体的指针,该结构的成员可以保存被创建进程的ID和句柄。

新建按钮资源

typedef struct _PROCESS_INFORMATION {      HANDLE hProcess; //进程的句柄      HANDLE hThread; //主线程的句柄      DWORD dwProcessId; //进程ID      DWORD dwThreadId; //主线程ID  } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;  

CreateProcess函数的最后两个参数都是指针,因此我们在使用时,要先定义STARTUPINFO和PROCESS_INFORMATION类型的变量,并使用ZeroMemory函数将其成员初始化。ZeroMemory函数可以将一段内存中的数据初始化为0.

PROCESS_INFORMATION pro_info; //进程信息  STARTUPINFO sti; //启动信息  //......  // 初始化两个结构体  ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));  ZeroMemory(&sti, sizeof(STARTUPINFO));  

接着调用CreateProcess创建进程.

CreateProcess(L"C:\\Windows\\System32\\calc.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pro_info);

调用成功后,PROCESS_INFORMATION结构体的hProcess就保存了被创建的进程的句柄了。

要结束进程,调用TerminateProcess函数,第一个参数就是刚才创建的时程的句柄,第二个参数是退出码,通过GetExitCodeProcess函数可以获取。

DWORD exitCode; //退出码  //.........  GetExitCodeProcess(pro_info.hProcess,&exitCode); //获取退出码  TerminateProcess(pro_info.hProcess, exitCode);  // 关闭句柄  CloseHandle(pro_info.hThread);  CloseHandle(pro_info.hProcess);  

再介绍一个在应用程序中运行其他程序的方法,那就是使用Shell函数——ShellExecute。

HINSTANCE ShellExecute(    _In_opt_  HWND hwnd,    _In_opt_  LPCTSTR lpOperation,    _In_      LPCTSTR lpFile,    _In_opt_  LPCTSTR lpParameters,    _In_opt_  LPCTSTR lpDirectory,    _In_      INT nShowCmd  );  

我们这里只是运行一个程序,没有其他操作,所以,带 In_opt的可选参数可以直接NULL,lpFile指定我们要运行程序的路径,如果是一个exe文件,那lpParameters可以指定命令行参数,但我们这里不需要,所以继续NULL,最后一个参数好理解,和ShowWindow函数一样。

于是,用ShellExecute函数打开记事本程序,当然记得包含shellapi.h。

ShellExecute(NULL,NULL,L"C:\\Windows\\System32\\notepad.exe",NULL,NULL,SW_SHOWNORMAL);  

对话框中完整代码

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){    switch (msg)    {        int wmId, wmEvent;    case WM_COMMAND:    {                       wmId = LOWORD(wParam);                       wmEvent = HIWORD(wParam);                       switch (wmId)                       {                       case 1000:                       {                                    PROCESS_INFORMATION pro_info; //进程信息                                      STARTUPINFO sti; //启动信息                                      //......                                      // 初始化两个结构体                                      ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));                                    ZeroMemory(&sti, sizeof(STARTUPINFO));                                    /*sti.cb = sizeof(STARTUPINFO);                                    sti.dwFlags = STARTF_USESHOWWINDOW;                                    sti.wShowWindow = SW_SHOW;*/                                    CreateProcess(L"C:\\Windows\\System32\\calc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sti, &pro_info);                       }                           break;                       case 1001:                       {                                    PROCESS_INFORMATION pro_info; //进程信息                                      STARTUPINFO sti; //启动信息                                      //......                                      // 初始化两个结构体                                      ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));                                    ZeroMemory(&sti, sizeof(STARTUPINFO));                                    DWORD exitCode; //退出码                                      //.........                                      GetExitCodeProcess(pro_info.hProcess, &exitCode); //获取退出码                                      TerminateProcess(pro_info.hProcess, exitCode);                                    // 关闭句柄                                      CloseHandle(pro_info.hThread);                                    CloseHandle(pro_info.hProcess);                       }                           break;                       case 1002:                       {                                    ShellExecute(NULL, NULL, L"C:\\Windows\\System32\\notepad.exe", NULL, NULL, SW_SHOWNORMAL);                       }                       default:                           return DefWindowProc(hDlg, msg, wParam, lParam);                       }    }    }    return (INT_PTR)FALSE;}
0 0
原创粉丝点击