本文主要讲一下如何利用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); //关闭子进程