如何隐藏子进程的控制台窗口?

时间:2009-12-21 11:01:20

标签: visual-c++-2008

我正在尝试编写一个非常简单的程序来替换现有的可执行文件。它应该稍微强调它的参数并用新参数执行原始程序。它应该被第三方库自动和静默地调用。

它运行正常,但它会弹出一个控制台窗口来显示被调用程序的输出。我需要控制台窗口不在那里。我不关心程序的输出。

我原来的尝试是作为控制台应用程序设置的,所以我想我可以通过编写一个同样的新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;
    }
}

3 个答案:

答案 0 :(得分:4)

使用CreateProcess功能代替execve。对于dw CreationFlags参数,传递CREATE_NO_WINDOW标志。您还需要将命令行作为字符串传递。

e.g。

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);
}

答案 1 :(得分: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的两行很重要。两者都需要存在。

我真的不明白这里发生了什么,但似乎有效。

答案 2 :(得分:0)

您需要创建一个非控制台应用程序(即Windows GUI应用程序)。如果所有这个应用程序都是一些文件处理或其他什么,你将不需要有一个WinMain,注册任何窗口或有一个消息循环 - 只需编写你的代码作为控制台应用程序。当然,你将无法使用printf等。当你来执行它时,使用exec()系列函数,而不是system()。