質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

解決済

1回答

1994閲覧

popenを使うとコンソールが出る

kokawa2003

総合スコア217

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

0グッド

0クリップ

投稿2018/06/29 00:43

mingw+qt+windowsでプログラムしています。
そのなかでpopen(_popen)を使っておりますが、それをつかった瞬間consoleがでます。

lang

1std::string docmd(char cmd[]){ 2 FILE *fp; 3 char path[1035]; 4 fp = popen(cmd, "r"); 5 if (fp == NULL) { 6 qDebug("Failed to run command\n" ); 7 exit(1); 8 } 9 10 std::string out; 11 12 while (fgets(path, sizeof(path)-1, fp) != NULL) { 13 14 out+=path; 15 16 } 17 pclose(fp); 18 19 return out; 20}

たとえば上のような関数をつくって
docmd("youtube-dl --list-formats http://www.youtube...");
みたいな形で呼ぶと
console(コマンドプロンプト)が表示されます。
popenを_popenに変えても同じようです。
これを抑える方法を知りませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

一応解決したようです。同関数の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 05:08

kokawa2003

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokawa2003

2018/06/29 07:39

中途半端なのでQtに入れたやつを追記 std::string docmd(char chCmd[]) { // パイプの作成 HANDLE readPipe=0; HANDLE writePipe=0; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; std::string out; if (CreatePipe(&readPipe, &writePipe, &sa, 0) == 0) { qDebug("PIPE の作成に失敗"); return ""; } STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.hStdOutput = writePipe; si.hStdError = writePipe; si.wShowWindow = SW_HIDE; wchar_t cmd[MAX_PATH]; // プロセスの起動(cmd.exe) swprintf(cmd, L"%s", chCmd); if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) == 0) { qDebug("PIPE 用プロセスの作成に失敗"); return ""; } HANDLE childProcess = pi.hProcess; CloseHandle(pi.hThread); char readBuf[1025]; bool end = false; do { DWORD totalLen, len; if (WaitForSingleObject(childProcess, 100) == WAIT_OBJECT_0) end = true; if (PeekNamedPipe(readPipe, NULL, 0, NULL, &totalLen, NULL) == 0) break; if (0 < totalLen) { if (ReadFile(readPipe, readBuf, sizeof(readBuf) - 1, &len, NULL) == 0) return ""; readBuf[len] = 0; out += readBuf; if (totalLen>len) // プロセスは終了しているがまだデータがーが残っているので終了を保留 end = false; } } while (end == false); if (CloseHandle(writePipe) == 0) { qDebug("書き込パイプのCLOSEに失敗"); } if (CloseHandle(readPipe) == 0) { qDebug("読み込みパイプのCLOSEに失敗"); } CloseHandle(pi.hProcess); return out; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問