2009-12-21 114 views
3

我想寫一個非常簡單的程序來替換現有的可執行文件。它應該輕微地談論它的論點,並用新的論證來執行原始程序。它應該由第三方庫自動和默默調用。如何隱藏子流程的控制檯窗口?

它運行良好,但它會彈出一個控制檯窗口來顯示被調用程序的輸出。我需要那個控制檯窗口不在那裏。我不關心程序的輸出。

我最初的嘗試是設立一個控制檯應用程序,所以我想我可以通過編寫一個新的Windows GUI應用程序,做同樣的事情解決這個問題。但它仍然彈出控制檯。我假設原來的命令被標記爲控制檯應用程序,所以Windows自動給它一個控制檯窗口來運行。爲了防萬一,我還嘗試用system()調用替換原來的_exec()調用。沒有幫助。

有誰知道我怎樣才能使這個控制檯窗口會消失嗎?

這裏是我的代碼:

int APIENTRY _tWinMain(HINSTANCE hInstance, 
         HINSTANCE hPrevInstance, 
         char* lpCmdLine, 
         int  nCmdShow) 
{ 
    char *argString, *executable; 
    // argString and executable are retrieved here 

    std::vector<std::string> newArgs; 
    // newArgs gets set up with the intended arguments here 

    char const ** newArgsP = new char const*[newArgs.size() + 1]; 
    for (unsigned int i = 0; i < newArgs.size(); ++i) 
    { 
     newArgsP[i] = newArgs[i].c_str(); 
    } 
    newArgsP[newArgs.size()] = NULL; 

    int rv = _execv(executable, newArgsP); 
    if (rv) 
    { 
     return -1; 
    } 
} 

回答

0

你需要創建一個非控制檯應用程序(即一個Windows GUI應用程序)。如果所有這些應用程序都是對文件進行某些處理或其他操作,則不需要WinMain,註冊任何窗口或者有消息循環 - 只需編寫代碼即可用於控制檯應用程序。當然,你將無法使用printf等。當你來執行它時,使用exec()系列函數,而不是system()。

+0

這就是我已經試過的,這就是我的意思是「非控制檯應用程序」。它似乎仍然彈出調用應用程序的控制檯窗口。 – 2009-12-21 11:30:23

+0

對不起,我誤讀了。如果你使用exec(),它絕對不應該彈出aconsole - 看到這個答案稍有不同的問題http://stackoverflow.com/questions/597818/gcc-c-how-to-hide-console-window – 2009-12-21 11:33:03

+0

但是這不是我所看到的。如果我用這個替換我的調用exec: newArgsP = new char const * [2]; newArgsP [0] =「hello.txt」; newArgsP [1] = NULL; _execv(「c:\\ WINDOWS \\ system32 \\ write.exe」,newArgsP); ...然後wordpad正確地出現沒有控制檯窗口。但是如果我讓它執行它應該的應用程序,那麼就會有一個帶有程序標準輸出的控制檯。所以我相信這與被調用的程序有關,而不是我的程序。 – 2009-12-21 12:07:18

1

啊哈,我想我找到了答案上MSDN,至少如果我準備使用.NET。 (我不認爲我真的應該,但我會忽略現在。)

System::String^ command = gcnew System::String(executable); 
System::Diagnostics::Process^ myProcess = gcnew Process; 
myProcess->StartInfor->FileName = command; 
myProcess->StartInfo->UseShellExecute = false; //1 
myProcess->StartInfo->CreateNowindow = true; //2 
myProcess->Start(); 

這是這兩條線標記// 1和2 //這是非常重要的。兩者都需要在場。

我真不明白這是怎麼回事,但它似乎工作。

+0

這是怎麼回事,這是告訴.NET做什麼[tyranid的解決方案](http://stackoverflow.com/a/1986893/43452)建議。 – Stobor 2012-01-28 16:42:33

4

使用CreateProcess功能代替的execve的。對於dwCreationFlags參數傳遞CREATE_NO_WINDOW標誌。您還需要以字符串形式傳遞命令行。

例如

 
STARTUPINFO startInfo = {0}; 
PROCESS_INFORMATION procInfo; 
TCHAR cmdline[] = _T("\"path\\to\\app.exe\" \"arg1\" \"arg2\""); 
startInfo.cb = sizeof(startInfo); 
if(CreateProcess(_T("path\\to\\app.exe"), cmdline, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &startInfo, &procInfo)) 
{ 
    CloseHandle(procInfo.hProcess); 
    CloseHandle(procInfo.hThread); 
}