推 logs:謝謝! 07/19 19:42
※ 引述《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