Windows下,在C++中执行exe,以及执行命令有其中一下几种方法:
(1)system
(2)ShellExecute
(3)CreateProcess
(4)使用通道
一、使用system
这个都比较熟悉,直接system(“cmd”);即可
二、使用shellExecute
int ret = (int)ShellExecute(NULL, L"", L"fortemp.exe",NULL, L"F:\\vs2017workplace\\ConsoleTest\\", SW_SHOWNA);
其中第三个参数是所要执行的exe文件,第五个参数是所要执行的exe文件所在目录。
三、使用CreatProcess
TCHAR szCmdline[] = TEXT("F:/vs2017workplace/ConsoleTest/fortemp.exe"); // 设置子进程路径
BOOL bSuccess = FALSE;
PROCESS_INFORMATION pi; // 用来接收新进程的识别信息
STARTUPINFO si; // 用于决定新进程的主窗体如何显示
// 设置PROCESS_INFORMATION
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); // 用0填充内存区域
// 设置STARTUPINFO
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO); // 结构大小
//HANDLE read1, write1, read2, write2;
//*************** 句柄继承设置******************
// 创建了两个管道
// 管道1由父进程读,子进程写
// 管道2由父进程写,子进程读
//si.hStdError = write1; // 错误输出句柄(在写句柄中写回父进程)
//si.hStdOutput = write1; // 子进程继承管道1写句柄
//si.hStdInput = read2; // 子进程继承管道2读句柄
//*************** 句柄继承设置******************
si.dwFlags |= STARTF_USESTDHANDLES; // 使用hStdInput 、hStdOutput 和hStdError 成员
// 创建子进程
// 摘自msdn:
// If lpApplicationName is NULL,
// the first white space–delimited token of the command line specifies the module name.
bSuccess = CreateProcess(
NULL, // lpApplicationName
szCmdline, // command line
// 以上两个字段都可以创建目标子进程
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // bInheritHandles:指示新进程是否从调用进程处继承了句柄
0, // creation flags:指定附加的、用来控制优先类和进程的创建的标志。
// 设置为 CREATE_NEW_CONSOLE 可显示子窗口
NULL, // use parent's environment
NULL, // use parent's current directory
&si, // STARTUPINFO :指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体
&pi // PROCESS_INFORMATION :指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体
);
// If an error occurs, exit the application.
if (!bSuccess)
cout << "创建子程序失败" << endl;
else
{
cout << "创建子程序成功" << endl;
// 关闭一些子进程用的句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}`
这段代码来源于其他博客,但是我没有执行通过,但也是一种执行exe或者执行命令的一种方法,不建议使用。
四、使用通道
bool bRet = false;
// chcp 437 这个命令把操作系统默认语言强制转换成英文显示,便于解析。
//const string PING_CMD = "chcp 437 && F:\\Projects\\git\\fdebugger\\Tests\\BasicStmtTest\\XtestResult\\a.exe ";
const string PING_CMD = "F:\\vs2017workplace\\ConsoleTest\\fortemp.exe";
string PING_CMD_IP(PING_CMD);
// PING_CMD_IP.append(IP);
char pingResult[512] = { 0 };
// 通过管道调用命令
FILE *pPipe;
if (NULL == (pPipe = _popen(PING_CMD_IP.c_str(), "rt")))
{
exit(1);
}
// 解析结果
while (fgets(pingResult, 512, pPipe))
{
// 打印 结果
cout << pingResult << endl;
}
_pclose(pPipe);
return bRet;
使用通道的方法在执行exe文件时可能会不通过,但是执行其他的命令时不失为一种好方法,他可以不出现命令提示符的黑框。