日常开发中,经常回碰到需要调用第三方应用,如果只是简单调用,那么久很简单,如果想和第三方应用进行简单的交互也是可以的。
实现方法:
1、创建一个可读写管道
2、设置读写管道替代输出、输入设备
3、创建 exe 后, 只需要操作读写管道即可
```cpp
int SystemEx(const char * cmd, std::string& msg) {
SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
msg = "CreatePipe failure";
return -1;
}
STARTUPINFOA si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfoA(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcessA(NULL, (char*)cmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
{
msg = "CreateProcess failure";
return -1;
}
CloseHandle(hWrite);
char buffer[4096] = { 0 };
DWORD bytesRead;
while (true)
{
memset(buffer, 0, sizeof(buffer));
if (ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL)
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
//printf(buffer);//这行注释掉就可以了
msg += buffer;
//Sleep(1);
}
DWORD retCode = -1;
GetExitCodeProcess(pi.hProcess, &retCode);
CloseHandle(pi.hProcess);
return retCode;
}
```