VC6.0利用CreateProcess创建子进程,MFC调用Win32生成的.exe文件为例

本文主要讲一下如何利用MFC调用Win32的可执行文件(.exe)。

在此之前,简单了解一下CreateProcess函数。该函数的

BOOL CreateProcess

(

LPCTSTR lpApplicationName,//可执行文件的绝对路径,如:“F:\工程项目\proj1\Debug\test.exe”,当然也可以是相对路径,但是本人建议最好用绝对路径,并且通过简单程序编程容易得到绝对路径。

LPTSTR lpCommandLine,         //该字符指定要执行的命令行(由于本文调用的是.exe文件,故设为“NULL”)

LPSECURITY_ATTRIBUTES lpProcessAttributes,        //通常设置为NULL

LPSECURITY_ATTRIBUTES lpThreadAttributes,         //通常设置为NULL

BOOL bInheritHandles,                                                  //通常设置为FALSE

DWORD dwCreationFlags,                                            //通常设置为0

LPVOID lpEnvironment,                                                 //通常设置为NULL

LPCTSTR lpCurrentDirectory,                                       //通常设置为NULL

LPSTARTUPINFO lpStartupInfo,                                   //指向一个用于决定新进程的主窗体如何显示STARTUPINFO结构体。STARTUPINFO属性需要设置,后面会具体介绍

LPPROCESS_INFORMATIONlpProcessInformation     //指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。

)

STARTUPINFO结构体,这里我只讲一下常用的几个参数。

typedef struct _STARTUPINFO {

DWORD cb;               //一般直接赋值:sizeof(STARTUPINFO)

LPTSTR lpReserved;//通常设置为NULL

LPTSTR lpDesktop;  //通常设置为NULL

LPTSTR lpTitle;        //子进程窗口的名称的字符串

DWORD dwX;       

DWORD dwY;

DWORD dwXSize;

DWORD dwYSize;

DWORD dwXCountChars;

DWORD dwYCountChars;

DWORD dwFillAttribute;

DWORD dwFlags;     //这个参数非常重要,详见百度百科http://baike.baidu.com/view/2254534.htm?fr=aladdin

     //因为本程序中,想要显示子进程.exe在DOS界面中的输出文字,故设置为STARTF_USESHOWWINDOW

WORD wShowWindow;//设置为SW_SHOW

WORD cbReserved2;//设为0

LPBYTE lpReserved2;//设为NULL

HANDLE hStdInput;

HANDLE hStdOutput;

HANDLE hStdError;

} STARTUPINFO, *LPSTARTUPINFO


举例说明

char sPath[200] ="\0";                          //创建一个字符数组,用于存放可执行文件的绝对路径
GetModuleFileNameA(NULL,sPath,200);//获得当前主程序的工作空间
char *fp = sPath;
int i=0;
while(*fp!=NULL)                                //寻找到Debug文件夹,因为原来的.exe文件是与Debug相同的存放路径
{
	if(*fp=='\\'&&*(fp+1) =='D'&&*(fp+2)=='e'&&*(fp+3)=='b'&&*(fp+4)=='u'&&*(fp+5)=='g'&&*(fp+6)=='\\')
	{
		sPath[i]=0;
	}
	else
	{
		fp++;
		i++;
	}
}

strcat(sPath,"\\test_42.exe");                  //获得可执行文件test_42.exe的完整路径
STARTUPINFO startupinfo;                        //创建STARTUPINFO结构变量startupinfo
PROCESS_INFORMATION pinfo;                      //创建PROCESS_INFORMATION变量pinfo

startupinfo.cb = sizeof(STARTUPINFO);
startupinfo.lpReserved = NULL;
startupinfo.lpDesktop = NULL;
startupinfo.lpTitle = "42#测试";
startupinfo.dwFlags = STARTF_USESHOWWINDOW;
startupinfo.cbReserved2 = 0;
startupinfo.lpReserved2 = NULL;
startupinfo.wShowWindow = SW_SHOW;

BOOL bSuccess = CreateProcess(sPath,
	NULL,
	NULL,
	NULL,
	FALSE,
	0,
	NULL,
	NULL,
	&startupinfo,
	&pinfo
	);
WaitForSingleObject(pinfo.hProcess,INFINITE);//等待子进程结束
CloseHandle(pinfo.hProcess);
CloseHandle(pinfo.hThread);                  //关闭子进程





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值