【最終編集】
同様のSOの質問は、上記のすべてをマージし、コンソールなしで出力C++popenコマンドを取得します
[再編集]
えーと。申し訳ありませんが、スポーンプロセスに興奮しました。私はあなたのqを読み直しました。余分なウィンドウは別として、実際にはプロセスのstdout/stderrを取得しようとしています。その目的のためにそれを追加したいのですが、私の提案はすべて悲しいことに無関係です。ただし、参考のためにここに残しておきます。
[編集]
特別な理由はありませんが(「open」がWindowsとMacの両方で機能することを除いて)、CreateProcessではなくShellExecuteをスポーンプロセスに使用します。これについては後で調べますが、これが私の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\"" )
これらのオプションをリンカーに直接フィードすることもできます。上記は、さまざまなビルド構成で簡単に操作できます。