2012-10-17 46 views
4

我有一個可以工作的C++ MFC程序,但我也希望能夠通過命令行調用更簡單的版本。 (如果有cmd行參數,這可以使用cmd行版本。)我希望程序使用當前打開的「cmd」窗口,並在某種程度上爲它創建一個新的shell。在InitInstance()中,我有...如何創建一個可以在GUI對話模式下或通過命令行啓動的C++ MFC程序?

CString cmdLine; 
cmdLine.Format("%s", this->m_lpCmdLine); 
if(cmdLine.IsEmpty()) 
    dlg.DoModal(); // Run application normally 
else 
{ 
    CString header = "Welcome to the program!"; 
    AttachConsole(ATTACH_PARENT_PROCESS);  // Use current console window 
    LPDWORD charsWritten = 0; 
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), header, header.GetLength(), NULL, NULL); 
} 

如何獲取輸入到我的程序中? cin似乎不工作。我試過這樣的:

char input[10] = ""; 
while((strcmp(input, "q") != 0) && (strcmp(input, "quit") != 0)) 
    scanf("%s", input); 

但它似乎不工作,因爲命令窗口等待新的提示。

回答

4

最根本的問題是您的MFC程序沒有在其EXE頭文件中標記爲控制檯模式程序。所以命令處理器沒有理由等待它完成,就像它通常爲控制檯模式程序所做的那樣。你現在有兩個程序試圖從控制檯讀取你和cmd.exe。你輸了。

有幾種解決方法,都沒有吸引力:

  • start /wait yourapp.exe arg1 arg2...
  • 更改啓動程序的鏈接器+系統+子系統設置控制檯。當你發現你沒有任何參數時調用FreeConsole。閃存有點令人討厭,對於Java程序員而言是衆所周知的
  • 當你發現你有參數時調用AllocConsole()。你會得到你自己的控制檯。
+0

*首先調用'AttachConsole(ATTACH_PARENT_PROCESS)',如果失敗則調用'AllocConsole'。只有在必要時(例如,從Explorer.EXE調用時),您才能獲得自己的控制檯。 – MSalters

+0

不,這忽略了OP正試圖解決的問題,兩個程序試圖同時從控制檯讀取。 –

+0

freopen(「CON」,「w」,stdout); freopen(「CON」,「r」,stdin); 最好的作品 – user1754508

相關問題