2012-11-16 41 views
1

我想將所有控制檯輸出重定向到我自己的GUI控制檯,包括所有對C寫入函數的調用。D將stdout重定向到函數

事情我已經嘗試:

  • 創建一個新的數據流類,但stdio.stdout是一個文件,你不能流分配給它
  • 乾脆創建一個新的文件類,但你不能擴展一個結構

我是否需要深入探討C綁定?任何幫助非常感謝。

回答

2

我選擇了另一條路徑,寫了我自己的writeln函數。由於顯然我沒有使用終端直接輸出的庫,它似乎不像管道或文件那樣麻煩。

+0

這將工作,如果子進程是你的D應用程序。如果子應用程序是您自己的工作,那麼您可以使用某種形式的IPC將輸出發送到您的GUI。 – DejanLekic

1

一個簡單但卻很不好用的方法是使用C的freopen()將stdout重定向到一個臨時文件,然後爲您的控制檯讀取文件。

您可能可以在操作系統級別將其重定向到管道中,然後讓控制檯監聽管道的另一端。這會更清潔,但更多的痛苦。

無論哪種方式,我不認爲D庫會有很大幫助 - 你會想使用某種C庫解決方案。

3

在許多地方解釋了這個問題的典型解決方案。這篇文章解釋瞭如何在Windows上執行此操作:http://edn.embarcadero.com/article/10387

它在任何UNIX上的工作方式都是相同的。

簡而言之:

  1. 創建兩個管道,一個子進程標準輸入,和第二子進程標準輸出。
  2. 創建過程中,這兩個管道連接到它的標準輸入/輸出
  3. 現在從您的GUI你只從被攻擊到子進程標準輸出管道讀取和編寫到被攻擊到子進程標準輸入管道。

第二種方法更簡單,只要在運行某個子進程時簡單使用popen()函數即可。這個標準功能可以完成以上所有功能。