MFC中新建窗口(程序自己启动自己)相关函数的使用方法
a. 首先建立一个基于对话框的MFC应用。(相关过程略)
b. 在对话框上添加按钮或下拉菜单资源,然后添加处理程序,处理程序的类选择主窗口类,再在处理程序中加上一行程序即可完成新建窗口的创建:
WinExec(AfxGetApp()->m_pszExeName, SW_SHOW);
参数1 通过AfxGetApp()获得的当前进程的可执行程序名字
参数2 SW_SHOW表示以当前大小激活运行后的程序窗口并显示它
用WinExec这个函数创建新建窗口,代码简单,易于使用。但对于这个函数VS虽不报错,但经常提示应该使用CreateProcess函数。
c. 使用CreateProcess函数创建新建窗口举例:
PROCESS_INFORMATION info;
//CreateProcess函数参数之一,一个结构体,用于新建进程存放与进程、线程相关的句柄、进程或线程ID号等
STARTUPINFO startup;
//也是CreateProcess函数参数,也是一个结构体,存有创建新进程需要的一些信息
char szPath[128]; //字符型数组,用于存放程序的路径及文件名,作为参数传入CreateProcess
char* szCmdLine; //字符型指针变量,用于存放命令行参数,作为参数传入CreateProcess
GetModuleFileName(AfxGetApp()->m_hInstance, szPath, sizeof(szPath));
//通过GetModuleFileName函数获得当前进程的路径及文件名保存到szPath中;
szCmdLine = GetCommandLine();
//通过GetCommandLine()获得当前进程命令行参数并保存到szCmdLine中;
GetStartupInfo(&startup);
//通过GetStartupInfo函数获得当前进程的启动信息并保存到startup中。
CreateProcess(szPath, szCmdLine, NULL, NULL,FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startup, &info);
//参1 应用程序路径及名称
//参2 命令行信息
//参3 进程的安全属性,可以为空
//参4 线程的安全属性,可以为空
//参5 是否继承父进程的属性
//参6 创建标志
//参7 指向新的环境块的指针,可以为空
//参8 指向当前目录名的指针,可以为空
//参9 传递给新进程的信息
//参10 新进程返回的信息
本来创建新建窗口(新进程)的工作至此已经可以结束,程序已能正常运行,但VS总是提醒存在句柄信息泄露,为此需要再加上下面这三个语句:
WaitForSingleObject(info.hProcess, INFINITE); //等待新建进程结束
CloseHandle(info.hProcess); //关闭进程句柄
CloseHandle(info.hThread); //关闭相关线程句柄
形式上看,使用CreateProcess创建新窗口,比WinExec要复杂一些。