需求
为了在一个C++编写的项目中调用另一个exe文件,有如下的方法:
- 使用system函数
- 使用execl或者execv函数
- 使用WinExec函数
- 使用CreateProcess函数
- 使用ShellExcecuteEx函数
经过综合考虑,使用ShellExcecuteEx
函数的形式完成调用。
准备工作
首先,需要生成一个exe文件作为调用对象。
#include <iostream>
using namespace std;
int main()
{
cout << "Hi" << endl;
system("pause");
return 0;
}
将其生成的test.exe
放在路径E:\mfc\bin
下
编写ShellExcecuteEx函数
#include <iostream>
#include <shlobj.h> // 可替换为 windows.h
#include <shellapi.h>
#include <tchar.h>
using namespace std;
int main()
{
SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = _T("open");
shExecInfo.lpFile = _T("test.exe");
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = _T("E:\\mfc\\bin");
shExecInfo.nShow = SW_SHOW;
shExecInfo.hInstApp = NULL;
ShellExecuteEx(&shExecInfo);
if (shExecInfo.hProcess != NULL)
{
//等待程序运行完毕
WaitForSingleObject(shExecInfo.hProcess, INFINITE);
//关闭程序
TerminateProcess(shExecInfo.hProcess, 0);
shExecInfo.hProcess = NULL;
}
system("pause");
return 0;
}
注意事项:
- 路径要写在
shExecInfo.lpDirectory
中,同时地址要使用两个\
,而不是一个\
_T()
函数使用需要头文件tchar.h
lpParameters
此参数指定命令行参数
nShow
的参数选择:
参数 | 效果 |
---|---|
SW_HIDE | 隐藏窗口,活动状态给令一个窗口 |
SW_MINIMIZE | 最小化窗口,活动状态给令一个窗口 |
SW_RESTORE | 用原来的大小和位置显示一个窗口,同时令其进入活动状态 |
SW_SHOW | 用当前的大小和位置显示一个窗口,同时令其进入活动状态 |
SW_SHOWMAXIMIZED | 最大化窗口,并将其激活 |
SW_SHOWMINIMIZED | 最小化窗口,并将其激活 |
SW_SHOWMINNOACTIVE | 最小化一个窗口,同时不改变活动窗口 |
SW_SHOWNA | 用当前的大小和位置显示一个窗口,不改变活动窗口 |
SW_SHOWNOACTIVATE | 用最近的大小和位置显示一个窗口,同时不改变活动窗口 |
SW_SHOWNORMAL | 与SW_RESTORE相同 |