参考:https://www.cnblogs.com/acloud/archive/2012/08/30/2663395.html
以下代码测试有效:
CString CDynamicTyperJar::ExeCmd(CString _cmd)
{
//创建匿名管道
SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
HANDLE hRead, hWrite;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
return "";
}
//设置命令行进程启动信息(以隐藏方式启动命令并定位其输出到hWrite)
STARTUPINFO si = { sizeof(STARTUPINFO) };
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdError = hWrite;
si.hStdOutput = hWrite;
//启动命令行
PROCESS_INFORMATION pi;
if (!CreateProcess(NULL, (LPWSTR)(LPCWSTR)_cmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
{
return "";
}
//立即关闭hWrite
CloseHandle(hWrite);
//读取命令行返回值
CString strRet;
char buff[1024] = { 0 };
DWORD dwRead = 0;
while (ReadFile(hRead, buff, 1024, &dwRead, NULL))
{
//strRet.append(buff, dwRead);
strRet += (CString)buff;
}
CloseHandle(hRead);
return strRet;
}
这种方法适用于执行一次即结束的java程序,不适用于C++ Java 交互的场景。