我正在尝试编写一个非常简单的程序来替换现有的可执行文件。它应该稍微强调它的参数并用新参数执行原始程序。它应该被第三方库自动和静默地调用。
它运行正常,但它会弹出一个控制台窗口来显示被调用程序的输出。我需要控制台窗口不在那里。我不关心程序的输出。
我原来的尝试是作为控制台应用程序设置的,所以我想我可以通过编写一个同样的新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 :(得分: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()。