2009-09-23 50 views
2

我公司有一個大型的Windows應用程序,帶有文檔對象模型:打開應用程序,打開文件,進行一些更改,保存,關閉。我試圖從頂層切掉GUI,並創建一個控制檯應用程序,它接受一些參數,打開文件,做一些有用的事情,保存,關閉文件並終止。由於存在大量遺留代碼,我不得不使用VCL表單應用程序,並從命令行(或批處理腳本)啓動它。我真的需要能夠打印到標準輸出,因此我可以寫出狀態消息,響應「--version」和「 - ?」等選項。我花了整整一天的時間在Google上搜索這個主題,但我還沒有發現任何有用的信息。VCL表單應用程序寫入stdout

該應用程序使用VCL編寫在CodeGear C++ Builder 2007中。

回答

1

您可以寫信給STDOUT的GUI程序,除非從實際的控制檯啓動,否則通常不會有任何輸出,因爲沒有控制檯。或者,查看Win32 API中的GetStdHandle()和WriteConsole()函數。如果GetStdHandle()返回一個有效的句柄,那麼你可以寫信給它。如果您的GUI應用程序是由另一個應用程序爲了自己的目的想攔截您的STDOUT輸出而啓動的,那麼這非常有用。

+0

嗯,我現在沒有使用任何控制檯輸出,但是當我回到它時我會嘗試這個。謝謝。 – 2009-09-24 21:43:09

0

在項目文件中使用{$ APPTYPE CONSOLE}。這將分配一個控制檯(即使您的應用程序仍然基於表單)。

或者,你可以做基於分支項目中的(.DPR)文件的命令行參數(Delphi代碼如下 - 你來轉換成C++ Builder的當量)。你仍然需要APPTYPE定義,或者你需要使用的Win32 API控制檯功能來創建自己的控制檯(見MSDN Console Functions更多信息):

begin 
    if ParamCount() > 0 then 
    DoWhateverTheConsoleAppWouldDoHere() 
    else 
    begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
    end; 
end; 
+1

APPTYPE適用於Delphi,而不適用於C++ Builder。對C++沒有同等的含義。喬納森需要創建一個實際的「控制檯」項目,而不是一個GUI項目。 – 2009-09-23 22:34:49

+0

啊。謝謝,雷米,爲更正。我想實際的做法是使用控制檯功能,在我的回答中,我將喬納森稱爲Jonathan。 – 2009-09-24 12:32:09

2

如果你只是想顯示在控制檯窗口中,你可以調用AllocConsole和FreeConsole然後,你可以調用WriteLn(「XXX」)就像你通常會與一個控制檯應用程序。但是,如果從命令行運行此應用程序,它仍然會創建一個新的控制檯,標準輸出將轉到新的控制檯而不是調用控制檯。

AllocConsole和FreeConsole在Windows單元中原型化。