#include <Windows.h>
#define MY_PIPE_BUFFER_SIZE 1024
void StartProcess(LPCWSTR program, LPCWSTR args)
{
//初始化管道
HANDLE hPipeRead;
HANDLE hPipeWrite;
SECURITY_ATTRIBUTES saOutPipe;
::ZeroMemory(&saOutPipe, sizeof(saOutPipe));
saOutPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
saOutPipe.lpSecurityDescriptor = NULL;
saOutPipe.bInheritHandle = TRUE;
if (CreatePipe(&hPipeRead, &hPipeWrite, &saOutPipe, MY_PIPE_BUFFER_SIZE))
{
PROCESS_INFORMATION processInfo;
::ZeroMemory(&processInfo, sizeof(processInfo));
STARTUPINFO startupInfo;
::ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(STARTUPINFO);
startupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
startupInfo.hStdOutput = hPipeWrite;
startupInfo.hStdError = hPipeWrite;
startupInfo.wShowWindow = SW_HIDE;
if (::CreateProcessW(program, (LPWSTR)args,
NULL, // process security
NULL, // thread security
TRUE, //inheritance
0, //no startup flags
NULL, // no special environment
NULL, //default startup directory
&startupInfo,
&processInfo))
{
if (WAIT_TIMEOUT != WaitForSingleObject(processInfo.hProcess, 3000))
{
DWORD dwReadLen = 0;
DWORD dwStdLen = 0;
if (PeekNamedPipe(hPipeRead, NULL, 0, NULL, &dwReadLen, NULL) && dwReadLen > 0)
{
char szPipeOut[MY_PIPE_BUFFER_SIZE];
::ZeroMemory(szPipeOut, sizeof(szPipeOut));
if (ReadFile(hPipeRead, szPipeOut, dwReadLen, &dwStdLen, NULL))
{
// 输出值
int k = 0;
}
int a = 1;
}
}
}
if (processInfo.hProcess)
{
CloseHandle(processInfo.hProcess);
}
if (processInfo.hThread)
{
CloseHandle(processInfo.hThread);
}
}
CloseHandle(hPipeRead);
CloseHandle(hPipeWrite);
}
参考文档:
https://blog.csdn.net/explorer114/article/details/79951972