一応解決したようです。同関数のPOSIXでないWINNDOWS特化版です。
C
1std::string doCmd(char chCmd[]) {
2 // パイプの作成
3 HANDLE readPipe;
4 HANDLE writePipe;
5 SECURITY_ATTRIBUTES sa;
6 sa.nLength = sizeof(sa);
7 sa.bInheritHandle = TRUE;
8 sa.lpSecurityDescriptor = NULL;
9 std::string out;
10 if (CreatePipe(&readPipe, &writePipe, &sa, 0) == 0) {
11 out = "パイプが作成できませんでした";
12 return out;
13 }
14 STARTUPINFO si;
15 PROCESS_INFORMATION pi;
16 ZeroMemory(&si, sizeof(si));
17 ZeroMemory(&pi, sizeof(pi));
18 si.cb = sizeof(si);
19 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
20 si.hStdOutput = writePipe;
21 si.hStdError = writePipe;
22 si.wShowWindow = SW_HIDE;
23 TCHAR cmd[MAX_PATH];
24 // プロセスの起動(cmd.exe)
25 _stprintf_s(cmd, sizeof(cmd) / sizeof(TCHAR), _TEXT("%s"), chCmd);
26 if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) == 0) {
27 //error
28 }
29 HANDLE childProcess = pi.hProcess;
30 CloseHandle(pi.hThread);
31 char readBuf[1025];
32 bool end = false;
33 do {
34 DWORD totalLen, len;
35 if (WaitForSingleObject(childProcess, 100) == WAIT_OBJECT_0)
36 end = true;
37 if (PeekNamedPipe(readPipe, NULL, 0, NULL, &totalLen, NULL) == 0)
38 break;
39 if (0 < totalLen) {
40 if (ReadFile(readPipe, readBuf, sizeof(readBuf) - 1, &len, NULL) == 0)
41 return false;
42 readBuf[len] = 0;
43
44 if (sizeof(mem) - 1<memSz + len) { //メモリがあふれないようにクリアする
45 mem[0] = 0;
46 memSz = 0;
47 }
48 memSz += len;
49 out += readBuf;
50 if (totalLen>len) // プロセスは終了しているがまだデータがーが残っているので終了を保留
51 end = false;
52 }
53 } while (end == false);
54
55 if (CloseHandle(writePipe) == 0) {
56 //error
57 }
58 if (CloseHandle(readPipe) == 0) {
59 //error
60 }
61 CloseHandle(pi.hProcess);
62
63 return out;
64}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/29 07:39