4.1进程和线程

a)进程创建

本例主要使用CreateProcess函数,语法格式如下:

BOOL CreateProcess(

LPCTSRT lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ARRRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

扫描二维码关注公众号,回复: 4968572 查看本文章

LPSTARTUPINFO lpStartupInfo,

LPPPROCESS_INFORMATION lpProcessInformation

);

参数说明:

lpApplicationName : 表示启动的应用程序名称,如果为NULL,则函数采用lpCommandLine参数提供的应用程序名称

lpCommandLine     :表示传递给应用程序的命令行参数

lpProcessAttributes:表示创建的进程的安全属性,如果为NULL,则采用当前进程的安全属性

lpThreadAttributes :表示线程的安全属性

bInheritHandles     :表示进程句柄能够被继承

dwCreationFlags   :表示创建标记,通常为CREATE_NEW_CONSOLE,表示告诉系统为新进程创建一个新的控制台窗口

lpEnvironment       :表示新进程使用的环境字符串的内容块

lpCurrentDirectory :设置子进程的当前驱动器目录

lpStartupInfo          :表示为子进程提供的开始信息。用户通常只需要定义一个STARTUPINFO结构对象,并设置对象的cb成员为结构大小即可

lpProcessInformation:用于记录子进程的进程句柄,线程句柄,进程ID等信息

设计过程:

设计一个点击按钮打开画图板程序。

主要代码如下:

void CMy4_1Process_ThreadDlg::OnBnClickedOpenmspaint()
{
    STARTUPINFO si;            //定义STARTUPINFO结构
    memset(&si, 0, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);//设定大小
    
    PROCESS_INFORMATION pi;
    memset(&pi, 0, sizeof(PROCESS_INFORMATION));    //定义PROCESS_INFOMATION
    //打开进程
    BOOL res = CreateProcess(NULL, _T("mspaint.exe"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    if (!res)
    {
        MessageBox(_T("CreateProcess failed"));
        return;
    }
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
}
这里有一点要注意,字符集选用Unicode有异常中断,我也不清楚什么愿意,有大神知道的话请留言。

我是更改为多字符集OK。

b)进程终止

TerminateProcess函数实现强行退出进程,

BOOL TerminateProcess(HANDLE hPrecess, UINT uExitCode);

参数说明:

hProcess     :表示需要结束的进程句柄

uExitCode   :表示进程结束时的退出代码。

void CMy4_1Process_ThreadDlg::OnBnClickedOpenmspaint()
{
    
    memset(&m_si, 0, sizeof(STARTUPINFO));
    m_si.cb = sizeof(STARTUPINFO);//设定大小
    
    memset(&m_pi, 0, sizeof(PROCESS_INFORMATION));    //定义PROCESS_INFOMATION
    //打开进程
    BOOL res = CreateProcess(NULL, _T("mspaint.exe"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &m_si, &m_pi);
    if (!res)
    {
        MessageBox(_T("CreateProcess failed"));
        return;
    }
    //CloseHandle(m_pi.hThread);//关闭子进程的主线程句柄
    //CloseHandle(m_pi.hProcess);//关闭子进程句柄
}


void CMy4_1Process_ThreadDlg::OnBnClickedClosemspaint()
{
    TerminateProcess(m_pi.hProcess, 0);
    CloseHandle(m_pi.hThread);
    CloseHandle(m_pi.hProcess);
}

猜你喜欢

转载自blog.csdn.net/qiukapi/article/details/83477168