Я думаю, что «чисто» вы имеете в виду как с перенаправлением 300. Конфигурация для большого количества серверов & amp; языки здесь .
Что-то вроде этого:
STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(path, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
}
Существует пример по телефону , который http://msdn.microsoft.com/en-us/library/ms682512 (По сравнению с 85) .aspx
Просто заменяет argv[1]
Вашей константой или переменный содержащий программу.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain( int argc, TCHAR *argv[] )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( argc != 2 )
{
printf("Usage: %s [cmdline]\n", argv[0]);
return;
}
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
Если Вы, приложение является приложением Windows GUI затем с помощью кода ниже, чтобы сделать ожидание, не идеальны, поскольку сообщения для приложения не будут получать обработку. Пользователю будет похоже, что Ваше приложение зависло.
WaitForSingleObject(&processInfo.hProcess, INFINITE)
Что-то как непротестированный код ниже мог бы быть лучше, поскольку это будет продолжать обрабатывать очередь сообщений окон, и Ваше приложение останется быстро реагирующим:
//-- wait for the process to finish
while (true)
{
//-- see if the task has terminated
DWORD dwExitCode = WaitForSingleObject(ProcessInfo.hProcess, 0);
if ( (dwExitCode == WAIT_FAILED )
|| (dwExitCode == WAIT_OBJECT_0 )
|| (dwExitCode == WAIT_ABANDONED) )
{
DWORD dwExitCode;
//-- get the process exit code
GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
//-- the task has ended so close the handle
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
//-- save the exit code
lExitCode = dwExitCode;
return;
}
else
{
//-- see if there are any message that need to be processed
while (PeekMessage(&message.msg, 0, 0, 0, PM_NOREMOVE))
{
if (message.msg.message == WM_QUIT)
{
return;
}
//-- process the message queue
if (GetMessage(&message.msg, 0, 0, 0))
{
//-- process the message
TranslateMessage(&pMessage->msg);
DispatchMessage(&pMessage->msg);
}
}
}
}
если Ваш exe, оказывается, консольное приложение, Вы могли бы интересоваться чтением stdout и stderr - для которого, я кротко отошлю Вас к этому примеру:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q190351
Это - что-то вроде полного рта кода, но я использовал изменения этого кода, чтобы метать икру и читать.
На полусвязанной ноте, если Вы хотите запустить процесс, который имеет больше полномочий, чем Ваш текущий процесс (говорят, запуская приложение администрирования, которое требует прав Администратора из главного приложения, работающего как обычный пользователь), Вы не можете сделать настолько использующего CreateProcess () на Vista, так как это не инициирует диалоговое окно контроля учётных записей (предположение, что это включено). Диалоговое окно контроля учётных записей инициировано при использовании ShellExecute (), все же.
Примите во внимание, что использование WaitForSingleObject
может получить Вас в проблему в этом сценарии. Следующее отрезано от подсказки относительно моего веб-сайта:
проблема возникает, потому что Ваше приложение имеет окно, но не качает сообщения. Если порожденное приложение вызовет SendMessage с одной из широковещательных целей ( HWND_BROADCAST или HWND_TOPMOST), то SendMessage не возвратится к новому приложению, пока все приложения не обработали сообщение - но Ваше приложение не может обработать сообщение, потому что это не качает сообщения...., таким образом, новое приложение запирается, таким образом, Ваше ожидание никогда не успешно выполняется.... МЕРТВАЯ БЛОКИРОВКА.
, Если Вы имеете неограниченный контроль над порожденным приложением, тогда существуют меры, которые можно принять, такие как использование SendMessageTimeout, а не SendMessage (например, для инициирования DDE, если кто-либо все еще использует это). Но существуют ситуации, которые вызывают неявные широковещательные сообщения SendMessage, над которыми Вы не имеете никакого контроля, такого как использование SetSysColors API, например.
единственные безопасные окольные пути это:
MsgWaitForMultipleObjects
API.