在没有控制台窗口的窗口中进行处理?

我在stream水线风格的应用程序中有很多进程。 每次启动应用程序时,都会有不同数量和顺序的stream程组成stream水线。

我的意图是通过主batch file启动它们,但是我想在没有控制台窗口的情况下运行它们。 我可以有一个控制台的批处理,但我宁愿不用9个不同的控制台窗口混乱用户的经验。

有没有办法实现这一点,而不需要安装服务? 或者也许有一个短暂的服务(如果可能的话)?

谢谢!

那么,在我看来,你将不得不做一些发展。 你可以做一个没有窗口的启动器应用程序(这个主题有很多信息)。

在启动器应用程序中,您将调用CreateProcess Windows API的一些变体。 您可以考虑使用CreateProcess的dwCreationFlags参数中的CREATE_NO_WINDOW标志。 阅读MSDN中的文档以了解限制。

这里是我在网上find的VC ++中的一些代码,我还没有testing它,但想法是:

//------------------------------------------------------------- // // File: Launcher.cpp // // Copyright 2005 (c) by Euphonix, Inc. // // Description: // // Simple shell application for XPE. Reads a registry entry // (set via target designer) to find an init file. Reads the // init file to find an app to launch and working dir to use. // Launches the app and waits for the launched process to // terminate. // // If failure occurs anywhere along the way, launches an XP // command window as a failsafe. // // Author: Fritz Mueller // // Creation Date: 8/3/05 // // Implementation Notes: // //------------------------------------------------------------- #define WINVER 0x0501 #include <afxwin.h> #include <tchar.h> #include <sstream> using namespace std; typedef basic_ostringstream<TCHAR> tostringstream; typedef basic_string<TCHAR> tstring; class LauncherErr { public: LauncherErr(DWORD iCode, const tstring &iDesc) : mCode(iCode), mDesc(iDesc) {} DWORD mCode; tstring mDesc; }; DWORD SpawnProcess( const tstring &cmdline, const tstring &workingdir, DWORD creationFlags) { DWORD result; BOOL success; STARTUPINFO si; ZeroMemory(&si, sizeof(si)); PROCESS_INFORMATION pi; success = CreateProcess( NULL, (LPTSTR)cmdline.c_str(), NULL, NULL, FALSE, creationFlags, NULL, workingdir.empty() ? NULL : workingdir.c_str(), &si, &pi ); if (!success) throw LauncherErr(GetLastError(), _T("Could not create process.")); result = WaitForSingleObject(pi.hProcess, INFINITE); if (result == WAIT_FAILED) throw LauncherErr(GetLastError(), _T("Process wait failed.")); DWORD exitcode; success = GetExitCodeProcess(pi.hProcess, &exitcode); if (!success) throw LauncherErr(GetLastError(), _T("Could not retrieve process exit code.")); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return exitcode; } int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { DWORD result; try { HKEY key; result = RegOpenKey(HKEY_LOCAL_MACHINE, _T("Software\\Euphonix\\LauncherShell\\"), &key); if (result != ERROR_SUCCESS) throw LauncherErr(GetLastError(), _T("Could not open launcher registry key.")); DWORD valuetype; TCHAR initpath[MAX_PATH]; DWORD initpathsize = sizeof(initpath); result = RegQueryValueEx(key, _T("InitFile"), NULL, &valuetype, (LPBYTE)initpath, &initpathsize); if (result != ERROR_SUCCESS) throw LauncherErr(GetLastError(), _T("Could not retrieve init file registry value.")); TCHAR cmdline[MAX_PATH]; DWORD cmdlinesize = MAX_PATH; cmdlinesize = GetPrivateProfileString(_T("application"), _T("cmdline"), NULL, cmdline, cmdlinesize, initpath); if (cmdlinesize == 0) throw LauncherErr(GetLastError(), _T("Could not retrieve command.")); TCHAR workingdir[MAX_PATH]; DWORD workingdirsize = MAX_PATH; workingdirsize = GetPrivateProfileString(_T("application"), _T("workingdir"), _T(""), workingdir, workingdirsize, initpath); result = SpawnProcess(cmdline, workingdir, DETACHED_PROCESS); } catch(const LauncherErr &err) { tostringstream str; str << _T("cmd /k echo Euphonix Launcher Error (") << err.mCode << _T("): ") << err.mDesc << endl; result = SpawnProcess(str.str(), _T(""), CREATE_NEW_CONSOLE); } return (result == ERROR_SUCCESS) ? 0 : -1; } 

希望这可以帮助。

如果这是在一个batch file中完成的,你不能使用START /B吗?