看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《logs ( )》之銘言: : ※ 引述《charleshu (Analog Engineer)》之銘言: : : 這類底層問題應該直接呼叫 Win32 API : : 呼叫CreateProcess : : 並請將新Process的STDIN和STDOUT改指向兩個Pipe即可. : 可以藉題問一下嗎? : 我想要 a.exe | b.exe : 也就是 a.exe 輸出 STDOUT 到 getstdin.exe : 其中 a.exe 是我所能掌控的 : getstdin.exe 是一個只能接收 STDOUT 的程式 : 但是 a.cpp 中會用到一些無法掌控的 library : 比如在 a.cpp 中要呼叫 external() : 正常來講,應該是沒有問題的 : 可是這個 external() 會輸出一些東西到 STDOUT : 使得 a.exe 輸出的 STDOUT 會混到一些奇怪的東西 : 我該怎麼把 external() 附帶的 STDOUT 給濾掉呢? : 有用過一個很蠢的替代方案 : (a.exe) stderr -> stdin (mid.exe) stdout -> stdin (getstdin.exe) : 其中 a.exe 會以 CreateProcess 來執行 mid.exe : 而 mid.exe 也會以 CreateProcess 來執行 getstdin.exe : 這樣子問題好像解決了,只不過本來可以很彈性、很系統的命令列執行 : 就變得很奇怪了 : ========================= : a.cpp 中使用的是很基本的方式寫入 STDOUT : fprintf(stdout, "1234"); : external(); // 這裡會寫入一些字串到 STDOUT : fprintf(stdout, "5678"); : 本來預期 a.exe 輸出到 STDOUT 的應該是 12345678 : 但是 external() 的亂入會變成 1234XXOOXX5678 : 有辦法在 external() 之前先暫時把 STDOUT 導向 NULL : 然後在其之後重新導回正常的 STDOUT pipe 嗎? 可以!! 你可以呼叫SetStdHandle把STDOUT用pipe handle或file handle覆蓋掉. 然後呼叫你的外部library. 最後再呼叫SetStdHandle恢復一切. 你可以到那個pipe或file裡找到外部library的輸出. 細節可參閱MSDN. -- Do not depend on others without effort... 當我年輕時,請教別人問題時常聽到上面那句話. 當時心裏偶而會有些小小抱怨. 當時間過去,我偶而會想到上面那句話, 心中十分感謝當初告訴我那句話的人. 當發現問題時,最有價值的不是問題的答案, 而是找到解決的方向,並在努力的過程裡具備解決問題的能力. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 221.169.217.133
logs:謝謝! 07/19 19:42