[最终编辑]
一个类似的 SO question 合并了上面所说的所有内容,并在没有控制台的情况下为您提供输出
C++ popen 命令
[再次编辑]
呃。抱歉,我对产卵过程感到兴奋。我重读了你的q。除了额外的窗口之外,您实际上是在尝试获取进程的标准输出/标准错误。为此,我想补充一点,可悲的是,我的所有建议都无关紧要。但我会把它们留在这里以供参考。
[已编辑]
没有很好的具体原因(除了“打开”适用于 windows 和 mac),我使用 ShellExecute 来生成进程而不是 CreateProcess。我稍后会研究..但这是我的 StartProcess 函数。
隐藏或最小化似乎产生相同的结果。cmd 窗口确实出现了,但它被最小化并且永远不会在桌面上弹出,这可能是您的主要目标。
#if defined(PLATFORM_WIN32)
#include <Windows.h>
#include <shellapi.h>
#elif defined(PLATFORM_OSX)
#include <sys/param.h>
#endif
namespace LGSysUtils
{
// -----------------------------------------------------------------------
// pWindow : {Optional} - can be NULL
// pOperation : "edit", "explore", "find", "open", "print"
// pFile : url, local file to execute
// pParameters : {Optional} - can be NULL otherwise a string of args to pass to pFile
// pDirectory : {Optional} - set cwd for process
// type : kProcessWinNormal, kProcessWinMinimized, kProcessWinMaximized, kProcessHidden
//
bool StartProcess(void* pWindow, const char* pOperation, const char* pFile, const char* pParameters, const char* pDirectory, LGSysUtils::eProcessWin type)
{
bool rc = false;
#if defined(PLATFORM_WIN32)
int showCmd;
switch(type)
{
case kProcessWinMaximized:
showCmd = SW_SHOWMAXIMIZED;
break;
case kProcessWinMinimized:
showCmd = SW_SHOWMINIMIZED;
break;
case kProcessHidden:
showCmd = SW_HIDE;
break;
case kProcessWinNormal:
default:
showCmd = SW_NORMAL;
}
int shellRC = (int)ShellExecute(reinterpret_cast<HWND>(pWindow), pOperation,pFile,pParameters,pDirectory,showCmd);
//Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise.
if( shellRC > 32 )
{
rc = true;
}
#elif defined(PLATFORM_OSX)
char cmd[1024];
sprintf(cmd, "%s %s", pOperation, pFile);
int sysrc = system( cmd );
dbPrintf("sysrc = %d", sysrc);
rc = true;
#endif
return rc;
}
}
[和之前提到的]
如果您可以控制启动的应用程序的源代码,则可以尝试将其添加到 main.cpp 的顶部(或您命名的任何名称)
// make this process windowless/aka no console window
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
您也可以直接将这些选项提供给链接器。对于不同的构建配置,以上内容更容易使用恕我直言。